<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>basalt</title>
    <subtitle>A small, fast, JS-optional Zola theme.</subtitle>
    <link rel="self" type="application/atom+xml" href="https://ttsigg.codeberg.page/basalt/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://ttsigg.codeberg.page/basalt"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-04-22T00:00:00+00:00</updated>
    <id>https://ttsigg.codeberg.page/basalt/atom.xml</id>
    <entry xml:lang="en">
        <title>Announcing basalt</title>
        <published>2026-04-22T00:00:00+00:00</published>
        <updated>2026-04-22T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://ttsigg.codeberg.page/basalt/blog/announcing-basalt/"/>
        <id>https://ttsigg.codeberg.page/basalt/blog/announcing-basalt/</id>
        
        <content type="html" xml:base="https://ttsigg.codeberg.page/basalt/blog/announcing-basalt/">&lt;p&gt;I&#x27;ve been quietly carving a theme out of my dev blog for a while. Today it lives in its own repo as &lt;strong&gt;basalt&lt;&#x2F;strong&gt;. This is the announcement.&lt;&#x2F;p&gt;
&lt;figure class=&quot;carousel-wrap&quot;&gt;
  &lt;div class=&quot;carousel&quot;
       data-carousel
       role=&quot;region&quot;
       aria-roledescription=&quot;carousel&quot;
       aria-label=&quot;basalt — homepage &#x2F; blog post &#x2F; project page&quot;
       tabindex=&quot;0&quot;&gt;

    &lt;ul class=&quot;carousel-track&quot; role=&quot;list&quot;&gt;&lt;li class=&quot;carousel-slide&quot; role=&quot;listitem&quot; aria-label=&quot;Slide 1 of 3&quot;&gt;&lt;a class=&quot;image-lightbox-trigger&quot; data-lightbox=&quot;https:&#x2F;&#x2F;ttsigg.codeberg.page&#x2F;basalt&#x2F;processed_images&#x2F;home-desktop-light.e464675acc2ab9f1.webp&quot; href=&quot;https:&#x2F;&#x2F;ttsigg.codeberg.page&#x2F;basalt&#x2F;processed_images&#x2F;home-desktop-light.e464675acc2ab9f1.webp&quot; aria-label=&quot;basalt homepage — open larger view&quot;&gt;
            &lt;img src=&quot;https:&#x2F;&#x2F;ttsigg.codeberg.page&#x2F;basalt&#x2F;processed_images&#x2F;home-desktop-light.ef77b67acccd2722.webp&quot; srcset=&quot;https:&amp;#x2F;&amp;#x2F;ttsigg.codeberg.page&amp;#x2F;basalt&amp;#x2F;processed_images&amp;#x2F;home-desktop-light.4f2a1296f02e689b.webp 400w, https:&amp;#x2F;&amp;#x2F;ttsigg.codeberg.page&amp;#x2F;basalt&amp;#x2F;processed_images&amp;#x2F;home-desktop-light.ef77b67acccd2722.webp 800w&quot; sizes=&quot;(max-width: 800px) 100vw, 800px&quot; width=&quot;800&quot; height=&quot;600&quot; alt=&quot;basalt homepage&quot;
              loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;
          &lt;&#x2F;a&gt;&lt;&#x2F;li&gt;&lt;li class=&quot;carousel-slide&quot; role=&quot;listitem&quot; aria-label=&quot;Slide 2 of 3&quot;&gt;&lt;a class=&quot;image-lightbox-trigger&quot; data-lightbox=&quot;https:&#x2F;&#x2F;ttsigg.codeberg.page&#x2F;basalt&#x2F;processed_images&#x2F;post-desktop-light.98b0327d5bfd2c67.webp&quot; href=&quot;https:&#x2F;&#x2F;ttsigg.codeberg.page&#x2F;basalt&#x2F;processed_images&#x2F;post-desktop-light.98b0327d5bfd2c67.webp&quot; aria-label=&quot;basalt blog post — open larger view&quot;&gt;
            &lt;img src=&quot;https:&#x2F;&#x2F;ttsigg.codeberg.page&#x2F;basalt&#x2F;processed_images&#x2F;post-desktop-light.e9616e69d73d87ae.webp&quot; srcset=&quot;https:&amp;#x2F;&amp;#x2F;ttsigg.codeberg.page&amp;#x2F;basalt&amp;#x2F;processed_images&amp;#x2F;post-desktop-light.e6646864252e2da7.webp 400w, https:&amp;#x2F;&amp;#x2F;ttsigg.codeberg.page&amp;#x2F;basalt&amp;#x2F;processed_images&amp;#x2F;post-desktop-light.e9616e69d73d87ae.webp 800w&quot; sizes=&quot;(max-width: 800px) 100vw, 800px&quot; width=&quot;800&quot; height=&quot;600&quot; alt=&quot;basalt blog post&quot;
              loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;
          &lt;&#x2F;a&gt;&lt;&#x2F;li&gt;&lt;li class=&quot;carousel-slide&quot; role=&quot;listitem&quot; aria-label=&quot;Slide 3 of 3&quot;&gt;&lt;a class=&quot;image-lightbox-trigger&quot; data-lightbox=&quot;https:&#x2F;&#x2F;ttsigg.codeberg.page&#x2F;basalt&#x2F;processed_images&#x2F;project-desktop-light.9803c2c21ac7e8f4.webp&quot; href=&quot;https:&#x2F;&#x2F;ttsigg.codeberg.page&#x2F;basalt&#x2F;processed_images&#x2F;project-desktop-light.9803c2c21ac7e8f4.webp&quot; aria-label=&quot;basalt project page — open larger view&quot;&gt;
            &lt;img src=&quot;https:&#x2F;&#x2F;ttsigg.codeberg.page&#x2F;basalt&#x2F;processed_images&#x2F;project-desktop-light.7521c47655873e4d.webp&quot; srcset=&quot;https:&amp;#x2F;&amp;#x2F;ttsigg.codeberg.page&amp;#x2F;basalt&amp;#x2F;processed_images&amp;#x2F;project-desktop-light.a433639511f416b6.webp 400w, https:&amp;#x2F;&amp;#x2F;ttsigg.codeberg.page&amp;#x2F;basalt&amp;#x2F;processed_images&amp;#x2F;project-desktop-light.7521c47655873e4d.webp 800w&quot; sizes=&quot;(max-width: 800px) 100vw, 800px&quot; width=&quot;800&quot; height=&quot;888&quot; alt=&quot;basalt project page&quot;
              loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;
          &lt;&#x2F;a&gt;&lt;&#x2F;li&gt;&lt;&#x2F;ul&gt;

    &lt;button class=&quot;carousel-nav carousel-prev&quot; type=&quot;button&quot; aria-label=&quot;Previous slide&quot; hidden&gt;
      &lt;svg class=&quot;icon&quot; width=&quot;20&quot; height=&quot;20&quot; aria-hidden=&quot;true&quot;&gt;&lt;use href=&quot;#icon-chevron&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
    &lt;&#x2F;button&gt;
    &lt;button class=&quot;carousel-nav carousel-next&quot; type=&quot;button&quot; aria-label=&quot;Next slide&quot; hidden&gt;
      &lt;svg class=&quot;icon&quot; width=&quot;20&quot; height=&quot;20&quot; aria-hidden=&quot;true&quot;&gt;&lt;use href=&quot;#icon-chevron&quot;&#x2F;&gt;&lt;&#x2F;svg&gt;
    &lt;&#x2F;button&gt;

    &lt;ol class=&quot;carousel-dots&quot; role=&quot;list&quot; hidden&gt;&lt;li&gt;&lt;button class=&quot;carousel-dot&quot; type=&quot;button&quot; data-slide=&quot;0&quot; aria-label=&quot;Go to slide 1&quot;&gt;&lt;&#x2F;button&gt;&lt;&#x2F;li&gt;&lt;li&gt;&lt;button class=&quot;carousel-dot&quot; type=&quot;button&quot; data-slide=&quot;1&quot; aria-label=&quot;Go to slide 2&quot;&gt;&lt;&#x2F;button&gt;&lt;&#x2F;li&gt;&lt;li&gt;&lt;button class=&quot;carousel-dot&quot; type=&quot;button&quot; data-slide=&quot;2&quot; aria-label=&quot;Go to slide 3&quot;&gt;&lt;&#x2F;button&gt;&lt;&#x2F;li&gt;&lt;&#x2F;ol&gt;
  &lt;&#x2F;div&gt;&lt;figcaption class=&quot;carousel-caption&quot;&gt;basalt — homepage &#x2F; blog post &#x2F; project page&lt;&#x2F;figcaption&gt;&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;what-it-is&quot;&gt;
&lt;a class=&quot;post-anchor&quot; href=&quot;#what-it-is&quot; aria-label=&quot;Permalink to what-it-is&quot;&gt;&lt;&#x2F;a&gt;
What it is&lt;&#x2F;h2&gt;
&lt;p&gt;basalt is a &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.getzola.org&#x2F;&quot;&gt;Zola&lt;&#x2F;a&gt; theme. Two-column reading layout that collapses inline on mobile, a command palette behind &lt;code&gt;&#x2F;&lt;&#x2F;code&gt;, comments that lazy-load from Mastodon or Bluesky on scroll, asciinema and KaTeX shortcodes, page-level background images, dark and light themes that follow the browser preference.&lt;&#x2F;p&gt;
&lt;p&gt;It&#x27;s small. Cold-load weight on a homepage stays under ~50 KB compressed including fonts, and drops much lower on warm visits. The bundles use Rollup &lt;code&gt;manualChunks&lt;&#x2F;code&gt; so heavy dependencies (Fuse, KaTeX, asciinema-player, DOMPurify) only download when a page actually needs them.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-it-is-not&quot;&gt;
&lt;a class=&quot;post-anchor&quot; href=&quot;#what-it-is-not&quot; aria-label=&quot;Permalink to what-it-is-not&quot;&gt;&lt;&#x2F;a&gt;
What it is not&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Not a framework.&lt;&#x2F;strong&gt; No React, no Vue, no Svelte, no hydration. Tera templates and SCSS, and a small amount of TypeScript that ships as ESM modules.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Not zero-JS.&lt;&#x2F;strong&gt; The command palette, comments, and code-copy want JavaScript. Everything has a noscript fallback, but the experience is best with JS on.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Not generic.&lt;&#x2F;strong&gt; It&#x27;s opinionated about typography (variable Inter &#x2F; Space Grotesk &#x2F; JetBrains Mono &#x2F; Newsreader), about how a status strip and a &quot;now&quot; section feel, about what belongs in a sidebar. It&#x27;s a theme that suits the way I like to write.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;architecture-in-a-sentence&quot;&gt;
&lt;a class=&quot;post-anchor&quot; href=&quot;#architecture-in-a-sentence&quot; aria-label=&quot;Permalink to architecture-in-a-sentence&quot;&gt;&lt;&#x2F;a&gt;
Architecture in a sentence&lt;&#x2F;h2&gt;
&lt;p&gt;Zola compiles content + templates into HTML, SCSS partials compile into one stylesheet, and Vite + Rollup compile TypeScript into committed bundles in &lt;code&gt;static&#x2F;dist&#x2F;&lt;&#x2F;code&gt; that consumer sites use verbatim. No &lt;code&gt;pnpm install&lt;&#x2F;code&gt; required at the site level.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-ships-in-v0-1&quot;&gt;
&lt;a class=&quot;post-anchor&quot; href=&quot;#what-ships-in-v0-1&quot; aria-label=&quot;Permalink to what-ships-in-v0-1&quot;&gt;&lt;&#x2F;a&gt;
What ships in v0.1&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Templates: a panes-style index (preserved as the &lt;a href=&quot;&#x2F;demo&#x2F;&quot;&gt;demo page&lt;&#x2F;a&gt;), blog single, project, page, section, taxonomy, now, resume.&lt;&#x2F;li&gt;
&lt;li&gt;Shortcodes: image, carousel, asciinema, katex, mermaid, project, plus pure-HTML audio, video, and privacy-enhanced youtube embeds. Live demos and reference live at &lt;a href=&quot;&#x2F;options&#x2F;&quot;&gt;&#x2F;options&#x2F;&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;Theme JS: theme switcher, vim-style keybinds, command palette with full-text search, lazy comments, code-copy.&lt;&#x2F;li&gt;
&lt;li&gt;Public extension API: &lt;code&gt;window.basalt.palette.register({...})&lt;&#x2F;code&gt; for site-level palette items; &lt;code&gt;config.extra.palette_actions&lt;&#x2F;code&gt; for declarative ones.&lt;&#x2F;li&gt;
&lt;li&gt;Per-page backgrounds: &lt;code&gt;extra.bg_image&lt;&#x2F;code&gt; + theme-aware overlay (with optional per-theme &lt;code&gt;bg_image_light&lt;&#x2F;code&gt; &#x2F; &lt;code&gt;bg_image_dark&lt;&#x2F;code&gt; variants).&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;where-to-next&quot;&gt;
&lt;a class=&quot;post-anchor&quot; href=&quot;#where-to-next&quot; aria-label=&quot;Permalink to where-to-next&quot;&gt;&lt;&#x2F;a&gt;
Where to next&lt;&#x2F;h2&gt;
&lt;p&gt;The &lt;a href=&quot;&#x2F;&quot;&gt;home page&lt;&#x2F;a&gt; has the design notes; &lt;a href=&quot;&#x2F;options&#x2F;&quot;&gt;&#x2F;options&#x2F;&lt;&#x2F;a&gt; is the full reference; demo posts exercise each feature; source is on &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;ttsigg&#x2F;basalt&quot;&gt;GitHub&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>now</title>
        <published>2026-04-22T00:00:00+00:00</published>
        <updated>2026-04-22T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://ttsigg.codeberg.page/basalt/now/"/>
        <id>https://ttsigg.codeberg.page/basalt/now/</id>
        
        <content type="html" xml:base="https://ttsigg.codeberg.page/basalt/now/"></content>
        
    </entry>
    <entry xml:lang="en">
        <title>basalt</title>
        <published>2026-04-22T00:00:00+00:00</published>
        <updated>2026-04-22T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://ttsigg.codeberg.page/basalt/projects/basalt-theme/"/>
        <id>https://ttsigg.codeberg.page/basalt/projects/basalt-theme/</id>
        
        <content type="html" xml:base="https://ttsigg.codeberg.page/basalt/projects/basalt-theme/">&lt;p&gt;The theme behind this site. Two-column reading layout, lazy comments from Mastodon and Bluesky, a command palette behind &lt;code&gt;&#x2F;&lt;&#x2F;code&gt;, asciinema and KaTeX shortcodes, page-level background images, light and dark themes that follow browser preference.&lt;&#x2F;p&gt;
&lt;p&gt;Pages stay under &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;512kb.club&#x2F;&quot;&gt;512kb.club&lt;&#x2F;a&gt; thresholds without tuning. The bundles use Rollup &lt;code&gt;manualChunks&lt;&#x2F;code&gt; so heavy dependencies (Fuse, KaTeX, asciinema-player, DOMPurify) only download when a page actually needs them.&lt;&#x2F;p&gt;

&lt;div class=&quot;card&quot;&gt;
  &lt;h3&gt;&lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;ttsigg&#x2F;basalt&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;basalt&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
  &lt;div class=&quot;mono card-meta&quot;&gt;
    
    
  &lt;&#x2F;div&gt;
  
  
&lt;&#x2F;div&gt;

&lt;h2 id=&quot;architecture-in-a-sentence&quot;&gt;
&lt;a class=&quot;post-anchor&quot; href=&quot;#architecture-in-a-sentence&quot; aria-label=&quot;Permalink to architecture-in-a-sentence&quot;&gt;&lt;&#x2F;a&gt;
Architecture in a sentence&lt;&#x2F;h2&gt;
&lt;p&gt;Zola compiles content + Tera templates into HTML, SCSS partials compile into a single stylesheet, and Vite + Rollup compile TypeScript into committed bundles in &lt;code&gt;static&#x2F;dist&#x2F;&lt;&#x2F;code&gt; that consumer sites use verbatim. No &lt;code&gt;pnpm install&lt;&#x2F;code&gt; required at the consumer.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;two-real-sites-consume-this&quot;&gt;
&lt;a class=&quot;post-anchor&quot; href=&quot;#two-real-sites-consume-this&quot; aria-label=&quot;Permalink to two-real-sites-consume-this&quot;&gt;&lt;&#x2F;a&gt;
Two real sites consume this&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;auxdev.net&quot;&gt;auxdev.net&lt;&#x2F;a&gt; — informal dev blog. Vim hotkeys, hero status strip, no comments.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;timsiggins.com&quot;&gt;timsiggins.com&lt;&#x2F;a&gt; — editorial portfolio. Glassmorphic sidebar, no hotkeys, no search.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Both override only what diverges. Most of the difference is a few SCSS files and one or two template overrides; the rest comes from basalt.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;get-started&quot;&gt;
&lt;a class=&quot;post-anchor&quot; href=&quot;#get-started&quot; aria-label=&quot;Permalink to get-started&quot;&gt;&lt;&#x2F;a&gt;
Get started&lt;&#x2F;h2&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function&quot;&gt;cd&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; your-zola-site&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;git&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; submodule&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; add&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; https:&#x2F;&#x2F;codeberg.org&#x2F;ttsigg&#x2F;basalt&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; themes&#x2F;basalt&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Set the minimum config:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable&quot;&gt;theme&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-string z-quoted&quot;&gt;basalt&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable&quot;&gt;build_search_index&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-constant z-language z-boolean&quot;&gt; true&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-section&quot;&gt;search&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable&quot;&gt;index_format&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-string z-quoted&quot;&gt;fuse_json&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-section&quot;&gt;extra&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable&quot;&gt;author&lt;&#x2F;span&gt;&lt;span&gt;          =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-string z-quoted&quot;&gt;Your Name&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable&quot;&gt;author_display&lt;&#x2F;span&gt;&lt;span&gt;  =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-string z-quoted&quot;&gt;You&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable&quot;&gt;tag&lt;&#x2F;span&gt;&lt;span&gt;             =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-string z-quoted&quot;&gt;yoursite.com&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable&quot;&gt;default_theme&lt;&#x2F;span&gt;&lt;span&gt;   =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-string z-quoted&quot;&gt;light&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;That builds. The full schema lives in &lt;code&gt;basalt&#x2F;config.toml&lt;&#x2F;code&gt; (this repo&#x27;s own demo) and the &lt;a href=&quot;&#x2F;options&#x2F;&quot;&gt;options reference&lt;&#x2F;a&gt; covers every key.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;source&quot;&gt;
&lt;a class=&quot;post-anchor&quot; href=&quot;#source&quot; aria-label=&quot;Permalink to source&quot;&gt;&lt;&#x2F;a&gt;
Source&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;ttsigg&#x2F;basalt&quot;&gt;codeberg.org&#x2F;ttsigg&#x2F;basalt&lt;&#x2F;a&gt;. MIT licence. README and roadmap live there. Contributions welcome, especially against the open roadmap items.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Comments, loaded from Mastodon</title>
        <published>2026-04-20T00:00:00+00:00</published>
        <updated>2026-04-20T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://ttsigg.codeberg.page/basalt/blog/comments-on-mastodon/"/>
        <id>https://ttsigg.codeberg.page/basalt/blog/comments-on-mastodon/</id>
        
        <content type="html" xml:base="https://ttsigg.codeberg.page/basalt/blog/comments-on-mastodon/">&lt;p&gt;This is a live demo of the Mastodon comment renderer that ships with &lt;a href=&quot;&#x2F;projects&#x2F;zola-mono&#x2F;&quot;&gt;zola-mono&lt;&#x2F;a&gt;. Scroll to the bottom and the thread populates from the instance&#x27;s public API. If you turn JavaScript off, nothing loads but the link still works.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;how-the-renderer-behaves&quot;&gt;
&lt;a class=&quot;post-anchor&quot; href=&quot;#how-the-renderer-behaves&quot; aria-label=&quot;Permalink to how-the-renderer-behaves&quot;&gt;&lt;&#x2F;a&gt;
How the renderer behaves&lt;&#x2F;h2&gt;
&lt;p&gt;Opt-in per post via front matter:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-invalid z-illegal&quot;&gt;+++&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-section&quot;&gt;extra&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable&quot;&gt;comments&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt; url&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-string z-quoted&quot;&gt;https:&#x2F;&#x2F;your.server&#x2F;@handle&#x2F;123456789&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt; pageSize&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 10&lt;&#x2F;span&gt;&lt;span&gt; }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-invalid z-illegal&quot;&gt;+++&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The template at &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;ttsigg&#x2F;basalt&#x2F;blob&#x2F;main&#x2F;templates&#x2F;partials&#x2F;comments.html&quot;&gt;templates&#x2F;partials&#x2F;comments.html&lt;&#x2F;a&gt; checks &lt;code&gt;page.extra.comments&lt;&#x2F;code&gt;, emits an empty &lt;code&gt;&amp;lt;section id=&quot;comments&quot;&amp;gt;&lt;&#x2F;code&gt; with a &lt;code&gt;data-url&lt;&#x2F;code&gt; attribute, and stops there. No API call fires during page render.&lt;&#x2F;p&gt;
&lt;p&gt;The small &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;ttsigg&#x2F;basalt&#x2F;blob&#x2F;main&#x2F;src&#x2F;comments&#x2F;loader.ts&quot;&gt;src&#x2F;comments&#x2F;loader.ts&lt;&#x2F;a&gt; sets up an &lt;code&gt;IntersectionObserver&lt;&#x2F;code&gt; on &lt;code&gt;#comments&lt;&#x2F;code&gt;. When the section scrolls into view it dynamically imports the platform-specific renderer, either &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;ttsigg&#x2F;basalt&#x2F;blob&#x2F;main&#x2F;src&#x2F;comments&#x2F;mastodon.ts&quot;&gt;src&#x2F;comments&#x2F;mastodon.ts&lt;&#x2F;a&gt; or &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;ttsigg&#x2F;basalt&#x2F;blob&#x2F;main&#x2F;src&#x2F;comments&#x2F;bsky.ts&quot;&gt;src&#x2F;comments&#x2F;bsky.ts&lt;&#x2F;a&gt;. Nothing else runs until the reader actually gets there.&lt;&#x2F;p&gt;
&lt;p&gt;The Mastodon renderer pulls the post&#x27;s &lt;code&gt;GET &#x2F;api&#x2F;v1&#x2F;statuses&#x2F;:id&#x2F;context&lt;&#x2F;code&gt; endpoint, reads the &lt;code&gt;descendants&lt;&#x2F;code&gt; array, and renders a nested tree in the same monospace type as the rest of the site. HTML content is sanitized with &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;cure53&#x2F;DOMPurify&quot;&gt;DOMPurify&lt;&#x2F;a&gt;, which loads on first use and caches thereafter.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-you-pay-for&quot;&gt;
&lt;a class=&quot;post-anchor&quot; href=&quot;#what-you-pay-for&quot; aria-label=&quot;Permalink to what-you-pay-for&quot;&gt;&lt;&#x2F;a&gt;
What you pay for&lt;&#x2F;h2&gt;
&lt;p&gt;Nothing, until you scroll. On pages without an &lt;code&gt;extra.comments&lt;&#x2F;code&gt; block, none of the comment scripts ship. On pages that do, the loader is about 300 bytes and the renderer is about 4kb, plus DOMPurify at about 22kb on first use. DOMPurify is the biggest single cost, and I&#x27;m open to suggestions for a smaller sanitiser.&lt;&#x2F;p&gt;
&lt;p&gt;There are no tracking pixels, no cookies, no third-party iframes, and no consent banner. The embedded thread is a plain DOM tree the reader&#x27;s browser drew from a public API response.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;alternative-flavours&quot;&gt;
&lt;a class=&quot;post-anchor&quot; href=&quot;#alternative-flavours&quot; aria-label=&quot;Permalink to alternative-flavours&quot;&gt;&lt;&#x2F;a&gt;
Alternative flavours&lt;&#x2F;h2&gt;
&lt;p&gt;Prefer Bluesky? There is a &lt;a href=&quot;&#x2F;blog&#x2F;comments-on-bluesky&#x2F;&quot;&gt;sister demo post&lt;&#x2F;a&gt; that shows the exact same flow against &lt;code&gt;app.bsky.feed.getPostThread&lt;&#x2F;code&gt;. The loader picks the renderer by the &lt;code&gt;data-platform&lt;&#x2F;code&gt; attribute on &lt;code&gt;#comments&lt;&#x2F;code&gt;, so swapping platforms is a one-line front-matter change.&lt;&#x2F;p&gt;
&lt;p&gt;Scroll down. The fediverse should do its thing in a moment.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Comments, loaded from Bluesky</title>
        <published>2026-04-19T00:00:00+00:00</published>
        <updated>2026-04-19T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://ttsigg.codeberg.page/basalt/blog/comments-on-bluesky/"/>
        <id>https://ttsigg.codeberg.page/basalt/blog/comments-on-bluesky/</id>
        
        <content type="html" xml:base="https://ttsigg.codeberg.page/basalt/blog/comments-on-bluesky/">&lt;p&gt;This is a live demo of the Bluesky comment renderer that ships with &lt;a href=&quot;&#x2F;projects&#x2F;zola-mono&#x2F;&quot;&gt;zola-mono&lt;&#x2F;a&gt;. Scroll to the bottom and the thread populates from the AT Protocol&#x27;s public appview. If you turn JavaScript off, the link at the top of the comment section still points at the canonical post.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;how-it-works&quot;&gt;
&lt;a class=&quot;post-anchor&quot; href=&quot;#how-it-works&quot; aria-label=&quot;Permalink to how-it-works&quot;&gt;&lt;&#x2F;a&gt;
How it works&lt;&#x2F;h2&gt;
&lt;p&gt;Opt-in per post via front matter:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-invalid z-illegal&quot;&gt;+++&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-section&quot;&gt;extra&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable&quot;&gt;comments&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt; url&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-string z-quoted&quot;&gt;https:&#x2F;&#x2F;bsky.app&#x2F;profile&#x2F;handle&#x2F;post&#x2F;id&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt; pageSize&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 10&lt;&#x2F;span&gt;&lt;span&gt; }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-invalid z-illegal&quot;&gt;+++&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;At build time the template writes an empty &lt;code&gt;&amp;lt;section id=&quot;comments&quot;&amp;gt;&lt;&#x2F;code&gt; with the post URL on &lt;code&gt;data-url&lt;&#x2F;code&gt; and the page size on &lt;code&gt;data-page-size&lt;&#x2F;code&gt;. Platform is inferred from the URL by the loader (bsky.app or &lt;code&gt;at:&#x2F;&#x2F;&lt;&#x2F;code&gt; → bluesky; everything else → mastodon). Nothing talks to the network until the reader scrolls the section into view.&lt;&#x2F;p&gt;
&lt;p&gt;When it does, &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;ttsigg&#x2F;basalt&#x2F;blob&#x2F;main&#x2F;src&#x2F;comments&#x2F;loader.ts&quot;&gt;src&#x2F;comments&#x2F;loader.ts&lt;&#x2F;a&gt; dynamically imports &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;ttsigg&#x2F;basalt&#x2F;blob&#x2F;main&#x2F;src&#x2F;comments&#x2F;bsky.ts&quot;&gt;src&#x2F;comments&#x2F;bsky.ts&lt;&#x2F;a&gt;, which does a two-call dance:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;com.atproto.identity.resolveHandle&lt;&#x2F;code&gt; to turn the handle into a DID. Cached in &lt;code&gt;localStorage&lt;&#x2F;code&gt; keyed by handle, so repeat visits to posts from the same author skip this step.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;app.bsky.feed.getPostThread&lt;&#x2F;code&gt; to pull the post, its replies, and the replies-to-replies. Rendered as a nested tree.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;The endpoints are the official &lt;code&gt;public.api.bsky.app&lt;&#x2F;code&gt; appview. No PDS auth required. If you rate-limit yourself by sitting on the post for an hour, hit refresh.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-gets-rendered&quot;&gt;
&lt;a class=&quot;post-anchor&quot; href=&quot;#what-gets-rendered&quot; aria-label=&quot;Permalink to what-gets-rendered&quot;&gt;&lt;&#x2F;a&gt;
What gets rendered&lt;&#x2F;h2&gt;
&lt;p&gt;Reply text, author display name and handle, like and repost counts, and a relative timestamp. Links inside replies are rewritten via &lt;code&gt;rel=&quot;external nofollow&quot;&lt;&#x2F;code&gt;. Avatars load from &lt;code&gt;cdn.bsky.app&lt;&#x2F;code&gt; with &lt;code&gt;loading=&quot;lazy&quot;&lt;&#x2F;code&gt;. Text content does not run through a sanitiser because the AT Protocol returns the reply as plain text, not HTML, which is one of several small design decisions the Bluesky team got right.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;cost&quot;&gt;
&lt;a class=&quot;post-anchor&quot; href=&quot;#cost&quot; aria-label=&quot;Permalink to cost&quot;&gt;&lt;&#x2F;a&gt;
Cost&lt;&#x2F;h2&gt;
&lt;p&gt;The loader is about 300 bytes. The renderer is about 3kb. No extra sanitiser is needed. Avatars are the heaviest element, and they lazy-load. On a post with ten replies, the total cost of enabling comments is well under 10kb, and arrives only after the reader has shown interest.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;sister-post&quot;&gt;
&lt;a class=&quot;post-anchor&quot; href=&quot;#sister-post&quot; aria-label=&quot;Permalink to sister-post&quot;&gt;&lt;&#x2F;a&gt;
Sister post&lt;&#x2F;h2&gt;
&lt;p&gt;The &lt;a href=&quot;&#x2F;blog&#x2F;comments-on-mastodon&#x2F;&quot;&gt;Mastodon comments demo&lt;&#x2F;a&gt; shows the same flow against the Mastodon public API. The two renderers share the loader and the DOM shape, so the CSS applies to both.&lt;&#x2F;p&gt;
&lt;p&gt;Scroll down. The Bluesky thread should appear momentarily.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>lorem-ingest</title>
        <published>2026-03-14T00:00:00+00:00</published>
        <updated>2026-03-14T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://ttsigg.codeberg.page/basalt/projects/dummy-one/"/>
        <id>https://ttsigg.codeberg.page/basalt/projects/dummy-one/</id>
        
        <content type="html" xml:base="https://ttsigg.codeberg.page/basalt/projects/dummy-one/">&lt;p&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sed dolor at lectus pharetra rhoncus. Integer porttitor finibus magna, in pellentesque turpis vehicula vitae. Nullam consectetur enim id ligula auctor, in pharetra leo dapibus.&lt;&#x2F;p&gt;
&lt;p&gt;This page demonstrates the &lt;strong&gt;Codeberg&lt;&#x2F;strong&gt; variant of the &lt;code&gt;project&lt;&#x2F;code&gt; shortcode. basalt&#x27;s host detector spots &lt;code&gt;codeberg.org&lt;&#x2F;code&gt; and dispatches to the Gitea REST API at build time. The card below shows whatever metadata the upstream repo declares.&lt;&#x2F;p&gt;

&lt;div class=&quot;card&quot;&gt;
  &lt;h3&gt;&lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;ttsigg&#x2F;basalt&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;basalt&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
  &lt;div class=&quot;mono card-meta&quot;&gt;
    
    
  &lt;&#x2F;div&gt;
  
  
&lt;&#x2F;div&gt;

&lt;h2 id=&quot;what-lorem-ingest-would-do-in-theory&quot;&gt;
&lt;a class=&quot;post-anchor&quot; href=&quot;#what-lorem-ingest-would-do-in-theory&quot; aria-label=&quot;Permalink to what-lorem-ingest-would-do-in-theory&quot;&gt;&lt;&#x2F;a&gt;
What lorem-ingest would do, in theory&lt;&#x2F;h2&gt;
&lt;p&gt;Phasellus a feugiat eros. Sed sit amet sem nec massa rhoncus interdum non eu lectus. Curabitur sodales eros eget tortor placerat, et bibendum sapien tincidunt. Suspendisse euismod ipsum a nibh aliquet, ut sodales mauris pellentesque.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Ingest log lines from stdin&lt;&#x2F;li&gt;
&lt;li&gt;Filter by Lorem expression&lt;&#x2F;li&gt;
&lt;li&gt;Emit Ipsum-formatted JSON to stdout&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; main&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-storage z-type&quot;&gt;    let&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage&quot;&gt; mut&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt; buf&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-keyword z-operator z-assignment&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type z-rust&quot;&gt; String&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;::&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;new&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control&quot;&gt;    while&lt;&#x2F;span&gt;&lt;span&gt; io&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;::&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;stdin&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;read_line&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage&quot;&gt;mut&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt; buf&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;is_ok&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-storage z-type&quot;&gt; let&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; Some&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;parsed&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-keyword z-operator z-assignment&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; lorem&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;::&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;parse&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;buf&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;            println!&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-string z-quoted&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-string z-quoted&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt; parsed&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;to_ipsum_json&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable&quot;&gt;        buf&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;clear&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;screenshots&quot;&gt;
&lt;a class=&quot;post-anchor&quot; href=&quot;#screenshots&quot; aria-label=&quot;Permalink to screenshots&quot;&gt;&lt;&#x2F;a&gt;
Screenshots&lt;&#x2F;h2&gt;
&lt;p&gt;Drop screenshots into &lt;code&gt;content&#x2F;projects&#x2F;dummy-one&#x2F;screenshots&#x2F;&lt;&#x2F;code&gt; and reference them with the &lt;code&gt;image&lt;&#x2F;code&gt; shortcode below.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-you-d-actually-run&quot;&gt;
&lt;a class=&quot;post-anchor&quot; href=&quot;#what-you-d-actually-run&quot; aria-label=&quot;Permalink to what-you-d-actually-run&quot;&gt;&lt;&#x2F;a&gt;
What you&#x27;d actually run&lt;&#x2F;h2&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; lorem-ingest&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; access.log&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; |&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; jq&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; .severity&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;high&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;medium&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;high&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Vivamus tincidunt, magna sit amet pretium fermentum, augue felis aliquet nisl, ut commodo lectus risus eget urna. Cras sed orci nec ipsum facilisis volutpat.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>ipsum-mesh</title>
        <published>2026-02-08T00:00:00+00:00</published>
        <updated>2026-02-08T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://ttsigg.codeberg.page/basalt/projects/dummy-two/"/>
        <id>https://ttsigg.codeberg.page/basalt/projects/dummy-two/</id>
        
        <content type="html" xml:base="https://ttsigg.codeberg.page/basalt/projects/dummy-two/">&lt;p&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent vehicula nibh nec ipsum tincidunt feugiat. Nulla blandit, mauris non sodales aliquam, lectus arcu pulvinar lectus, sit amet rhoncus ligula massa nec leo.&lt;&#x2F;p&gt;
&lt;p&gt;This page demonstrates the &lt;strong&gt;GitHub&lt;&#x2F;strong&gt; variant of the &lt;code&gt;project&lt;&#x2F;code&gt; shortcode. basalt&#x27;s host detector spots &lt;code&gt;github.com&lt;&#x2F;code&gt; and dispatches to the GitHub REST API. The card below pulls the upstream &lt;code&gt;getzola&#x2F;zola&lt;&#x2F;code&gt; repo as a stand-in for what your real metadata would look like.&lt;&#x2F;p&gt;

&lt;div class=&quot;card&quot;&gt;
  &lt;h3&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;getzola&#x2F;zola&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;zola&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
  &lt;div class=&quot;mono card-meta&quot;&gt;
    
    
  &lt;&#x2F;div&gt;
  
  
&lt;&#x2F;div&gt;

&lt;h2 id=&quot;a-worked-example&quot;&gt;
&lt;a class=&quot;post-anchor&quot; href=&quot;#a-worked-example&quot; aria-label=&quot;Permalink to a-worked-example&quot;&gt;&lt;&#x2F;a&gt;
A worked example&lt;&#x2F;h2&gt;
&lt;p&gt;Sed lacinia, magna eget feugiat fermentum, ipsum sapien tincidunt purus, in fermentum quam tortor sed ipsum. Suspendisse potenti. Phasellus eu eros nibh.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;go&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-keyword z-type z-go&quot;&gt;type&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; Mesh&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-keyword z-struct z-go&quot;&gt; struct&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-variable z-other z-property&quot;&gt;    Nodes&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;Node&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-variable z-other z-property&quot;&gt;    Edges&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-keyword z-map z-go&quot;&gt; map&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;NodeID&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;NodeID&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-keyword z-function z-go&quot;&gt;func&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;m &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;*&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;Mesh&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; Lorem&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;target&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; NodeID&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;Path&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-storage z-type&quot;&gt; error&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-keyword z-control z-go&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt; _&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt; ok&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-keyword z-operator z-assignment&quot;&gt; :=&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt; m&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;Edges&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;target&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-keyword z-operator z-logical&quot;&gt; !&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;ok&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-keyword z-control z-go&quot;&gt;        return&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-constant z-language z-null&quot;&gt; nil&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt; ErrNoSuchNode&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control z-keyword z-control z-go&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt; m&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;bfs&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;m&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;Nodes&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;ID&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt; target&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-constant z-language z-null&quot;&gt; nil&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;why-it-matters&quot;&gt;
&lt;a class=&quot;post-anchor&quot; href=&quot;#why-it-matters&quot; aria-label=&quot;Permalink to why-it-matters&quot;&gt;&lt;&#x2F;a&gt;
Why it matters&lt;&#x2F;h2&gt;
&lt;p&gt;Aliquam erat volutpat. Sed in eros lacus. Praesent rhoncus orci a quam interdum, eu efficitur magna mollis. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae.&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Metric&lt;&#x2F;th&gt;&lt;th&gt;Lorem&lt;&#x2F;th&gt;&lt;th&gt;Ipsum&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Throughput&lt;&#x2F;td&gt;&lt;td&gt;10k req&#x2F;s&lt;&#x2F;td&gt;&lt;td&gt;12k req&#x2F;s&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Latency p99&lt;&#x2F;td&gt;&lt;td&gt;4ms&lt;&#x2F;td&gt;&lt;td&gt;3ms&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;CPU load&lt;&#x2F;td&gt;&lt;td&gt;35%&lt;&#x2F;td&gt;&lt;td&gt;38%&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Memory&lt;&#x2F;td&gt;&lt;td&gt;120MB&lt;&#x2F;td&gt;&lt;td&gt;140MB&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;The shape of the project shortcode is the same regardless of host. Pass &lt;code&gt;link=&lt;&#x2F;code&gt; and the right fetcher is picked automatically.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>dolor-pipeline</title>
        <published>2026-01-21T00:00:00+00:00</published>
        <updated>2026-01-21T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://ttsigg.codeberg.page/basalt/projects/dummy-three/"/>
        <id>https://ttsigg.codeberg.page/basalt/projects/dummy-three/</id>
        
        <content type="html" xml:base="https://ttsigg.codeberg.page/basalt/projects/dummy-three/">&lt;p&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque tincidunt, libero eget feugiat fermentum, lectus enim posuere ligula, sed pulvinar lacus libero non augue.&lt;&#x2F;p&gt;
&lt;p&gt;This page demonstrates the &lt;strong&gt;GitLab&lt;&#x2F;strong&gt; variant of the &lt;code&gt;project&lt;&#x2F;code&gt; shortcode. basalt&#x27;s host detector spots &lt;code&gt;gitlab.com&lt;&#x2F;code&gt; and dispatches to the GitLab Projects REST API. The card below pulls the upstream &lt;code&gt;gitlab-org&#x2F;gitlab&lt;&#x2F;code&gt; repo as a stand-in for what your real metadata would look like.&lt;&#x2F;p&gt;

&lt;div class=&quot;card&quot;&gt;
  &lt;h3&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;gitlab&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
  &lt;div class=&quot;mono card-meta&quot;&gt;
    
    
  &lt;&#x2F;div&gt;
  
  
&lt;&#x2F;div&gt;

&lt;h2 id=&quot;pipeline-shape&quot;&gt;
&lt;a class=&quot;post-anchor&quot; href=&quot;#pipeline-shape&quot; aria-label=&quot;Permalink to pipeline-shape&quot;&gt;&lt;&#x2F;a&gt;
Pipeline shape&lt;&#x2F;h2&gt;
&lt;p&gt;Curabitur tristique mauris vel velit cursus, vel placerat lectus efficitur. Suspendisse potenti. Nulla facilisi.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-storage z-type&quot;&gt;def&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; transform&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-parameters&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-variable z-parameter z-function&quot;&gt;rec&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-parameters&quot;&gt;)&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span&gt; rec&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;lorem&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-logical z-python z-keyword z-operator z-logical&quot;&gt; in&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other&quot;&gt; IPSUM_BLOCKLIST&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control&quot;&gt;        return&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-constant z-language z-python&quot;&gt; None&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-control&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-generic z-python&quot;&gt; Record&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-arguments&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;        id&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-keyword z-operator z-assignment&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;rec&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;id&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-arguments&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;        body&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-keyword z-operator z-assignment&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;rec&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;body&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-generic z-python&quot;&gt;lower&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-arguments&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-arguments&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-arguments&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-parameter&quot;&gt;        ts&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-keyword z-operator z-assignment&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;rec&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;ts&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-arguments&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-arguments&quot;&gt;    )&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;stream&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-keyword z-operator z-assignment&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Source&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-generic z-python&quot;&gt;from_kafka&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-arguments&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-string z-quoted&quot;&gt;topic.lorem&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-arguments&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    .&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-generic z-python&quot;&gt;filter&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-arguments&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-storage z-type&quot;&gt;lambda&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-variable z-parameter z-function&quot;&gt; r&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt; r&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;lang&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-keyword z-operator z-comparison&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-string z-quoted&quot;&gt;en&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-arguments&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    .&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-generic z-python&quot;&gt;map&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-arguments&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;transform&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-arguments&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    .&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-generic z-python&quot;&gt;filter&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-arguments&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type&quot;&gt;bool&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-arguments&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;stream&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-generic z-python&quot;&gt;sink&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-arguments&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;Sink&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-generic z-python&quot;&gt;to_postgres&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-arguments&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-string z-quoted&quot;&gt;schema.ipsum&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-arguments&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-arguments&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;why-this-is-paused&quot;&gt;
&lt;a class=&quot;post-anchor&quot; href=&quot;#why-this-is-paused&quot; aria-label=&quot;Permalink to why-this-is-paused&quot;&gt;&lt;&#x2F;a&gt;
Why this is paused&lt;&#x2F;h2&gt;
&lt;p&gt;In hac habitasse platea dictumst. Nullam non est at lectus dignissim ultrices. Nullam tincidunt nibh nec lectus dignissim, sed faucibus enim luctus. &lt;strong&gt;The blocker:&lt;&#x2F;strong&gt; the upstream Lorem schema flipped to v2 and the migration window is bigger than expected.&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Stage&lt;&#x2F;th&gt;&lt;th&gt;Status&lt;&#x2F;th&gt;&lt;th&gt;Note&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Schema mapping&lt;&#x2F;td&gt;&lt;td&gt;done&lt;&#x2F;td&gt;&lt;td&gt;v2 type table written&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Backfill&lt;&#x2F;td&gt;&lt;td&gt;wip&lt;&#x2F;td&gt;&lt;td&gt;18% of historical data migrated&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Cutover&lt;&#x2F;td&gt;&lt;td&gt;blocked&lt;&#x2F;td&gt;&lt;td&gt;needs a downtime slot&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Decommission&lt;&#x2F;td&gt;&lt;td&gt;future&lt;&#x2F;td&gt;&lt;td&gt;once cutover lands&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;Pipeline lives at the upstream. The card above shows topics, language, license, and recent activity. Anything else you can pull from the GitLab API can be added by extending &lt;code&gt;templates&#x2F;_project&#x2F;gitlab.html&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
</content>
        
    </entry>
</feed>
