<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Faffweasel Industries</title>
  <subtitle></subtitle>
  <link href="https://faffweasel.com/feed.xml" rel="self" type="application/atom+xml"/>
  <link href="https://faffweasel.com" rel="alternate" type="text/html"/>
  <id>https://faffweasel.com/</id>
  <updated>2026-05-06T05:33:28.286Z</updated>
  <author>
    <name>Phill</name>
  </author>
  <entry>
    <title>Template Variables</title>
    <link href="https://faffweasel.com/posts/template-variables" rel="alternate" type="text/html"/>
    <id>https://faffweasel.com/posts/template-variables</id>
    <published>2026-05-04T05:33:28.286Z</published>
    <updated>2026-05-06T05:33:28.286Z</updated>
    <author>
      <name>Phill</name>
    </author>
    <content type="html">&lt;p&gt;Template variables let you insert dynamic content into any post or page.&lt;/p&gt;
&lt;h2 id=&quot;recent-posts&quot;&gt;Recent Posts&lt;/h2&gt;
&lt;p&gt;The five most recent posts on this blog:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2 id=&quot;posts-by-tag&quot;&gt;Posts by Tag&lt;/h2&gt;
&lt;p&gt;Posts tagged &quot;demo&quot;:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2 id=&quot;all-tags&quot;&gt;All Tags&lt;/h2&gt;
&lt;p&gt;Every tag used on this blog:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2 id=&quot;blog-metadata&quot;&gt;Blog Metadata&lt;/h2&gt;
&lt;p&gt;This blog is called &lt;strong&gt;&lt;/strong&gt; and lives at .&lt;/p&gt;
&lt;h2 id=&quot;navigation&quot;&gt;Navigation&lt;/h2&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2 id=&quot;subscribe-form&quot;&gt;Subscribe Form&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;&lt;/code&gt; shortcode renders an inline subscribe form. Enable it in the admin config, then add the shortcode to any post, page, or sidebar.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Images and Embeds</title>
    <link href="https://faffweasel.com/posts/images-and-embeds" rel="alternate" type="text/html"/>
    <id>https://faffweasel.com/posts/images-and-embeds</id>
    <published>2026-05-03T05:33:28.286Z</published>
    <updated>2026-05-06T05:33:28.286Z</updated>
    <author>
      <name>Phill</name>
    </author>
    <content type="html">&lt;h2 id=&quot;uploaded-image&quot;&gt;Uploaded Image&lt;/h2&gt;
&lt;p&gt;Images uploaded through the admin panel are stripped of metadata and served from storage.&lt;/p&gt;
&lt;h2 id=&quot;youtube&quot;&gt;YouTube&lt;/h2&gt;
&lt;p&gt;A YouTube URL on its own line becomes a privacy-enhanced embed. No cookies are set until the viewer clicks play.&lt;/p&gt;
&lt;div class=&quot;tt-embed tt-embed-youtube&quot;&gt;&lt;iframe src=&quot;https://www.youtube-nocookie.com/embed/dQw4w9WgXcQ&quot; loading=&quot;lazy&quot; title=&quot;YouTube video&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;h2 id=&quot;spotify&quot;&gt;Spotify&lt;/h2&gt;
&lt;p&gt;A Spotify track URL works the same way:&lt;/p&gt;
&lt;div class=&quot;tt-embed tt-embed-spotify&quot;&gt;&lt;iframe src=&quot;https://open.spotify.com/embed/track/4cOdK2wGLETKBW3PvgPWqT&quot; loading=&quot;lazy&quot; title=&quot;Spotify embed&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;h2 id=&quot;vimeo&quot;&gt;Vimeo&lt;/h2&gt;
&lt;div class=&quot;tt-embed tt-embed-vimeo&quot;&gt;&lt;iframe src=&quot;https://player.vimeo.com/video/148751763&quot; loading=&quot;lazy&quot; title=&quot;Vimeo video&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;h2 id=&quot;images-in-context&quot;&gt;Images in Context&lt;/h2&gt;
&lt;p&gt;Images can sit between paragraphs like any other content. The theme controls max-width and spacing. A good theme ensures images don&apos;t overflow their container on mobile.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Tables and Structured Content</title>
    <link href="https://faffweasel.com/posts/tables-and-structured-content" rel="alternate" type="text/html"/>
    <id>https://faffweasel.com/posts/tables-and-structured-content</id>
    <published>2026-05-02T05:33:28.286Z</published>
    <updated>2026-05-06T05:33:28.286Z</updated>
    <author>
      <name>Phill</name>
    </author>
    <content type="html">&lt;p&gt;&lt;/p&gt;
&lt;h2 id=&quot;comparison-table&quot;&gt;Comparison Table&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Supported&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Markdown&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;GFM flavour including tables&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Code highlighting&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Via highlight.js&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RSS feed&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Atom format&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Search&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Pagefind, client-side&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Custom CSS&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Sanitised for safety&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Embeds&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;td&gt;YouTube, Spotify, Vimeo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Comments&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;By design&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tracking&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;By design&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;alignment&quot;&gt;Alignment&lt;/h2&gt;
&lt;p&gt;Tables support column alignment:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th align=&quot;left&quot;&gt;Left&lt;/th&gt;
&lt;th align=&quot;center&quot;&gt;Centre&lt;/th&gt;
&lt;th align=&quot;right&quot;&gt;Right&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;Text&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;Text&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;Text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;Longer text&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;Longer text&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;Longer text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;1&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;2&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;task-lists&quot;&gt;Task Lists&lt;/h2&gt;
&lt;p&gt;GFM task lists render as checkboxes:&lt;/p&gt;
&lt;ul class=&quot;contains-task-list&quot;&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; checked disabled&gt; Set up the database&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; checked disabled&gt; Create admin account&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; disabled&gt; Write content&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; disabled&gt; Configure theme&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; disabled&gt; Deploy&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;nested-content&quot;&gt;Nested Content&lt;/h2&gt;
&lt;p&gt;Lists can nest:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Top level
&lt;ul&gt;
&lt;li&gt;Second level
&lt;ul&gt;
&lt;li&gt;Third level&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Back to second&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Back to top&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;subheading&quot;&gt;Subheading&lt;/h3&gt;
&lt;h4 id=&quot;subsubheading&quot;&gt;Subsubheading&lt;/h4&gt;</content>
  </entry>
  <entry>
    <title>Code and Syntax Highlighting</title>
    <link href="https://faffweasel.com/posts/code-and-syntax-highlighting" rel="alternate" type="text/html"/>
    <id>https://faffweasel.com/posts/code-and-syntax-highlighting</id>
    <published>2026-05-01T05:33:28.286Z</published>
    <updated>2026-05-06T05:33:28.286Z</updated>
    <author>
      <name>Phill</name>
    </author>
    <content type="html">&lt;p&gt;Code blocks get automatic syntax highlighting. Here are examples across a few languages.&lt;/p&gt;
&lt;h2 id=&quot;javascript&quot;&gt;JavaScript&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;hljs language-javascript&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;greet&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot;&gt;name&lt;/span&gt;) {
  &lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; message = &lt;span class=&quot;hljs-string&quot;&gt;`Hello, &lt;span class=&quot;hljs-subst&quot;&gt;${name}&lt;/span&gt;!`&lt;/span&gt;;
  &lt;span class=&quot;hljs-variable language_&quot;&gt;console&lt;/span&gt;.&lt;span class=&quot;hljs-title function_&quot;&gt;log&lt;/span&gt;(message);
  &lt;span class=&quot;hljs-keyword&quot;&gt;return&lt;/span&gt; message;
}

&lt;span class=&quot;hljs-comment&quot;&gt;// Arrow function variant&lt;/span&gt;
&lt;span class=&quot;hljs-keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;hljs-title function_&quot;&gt;greet&lt;/span&gt; = (&lt;span class=&quot;hljs-params&quot;&gt;name&lt;/span&gt;) =&gt; &lt;span class=&quot;hljs-string&quot;&gt;`Hello, &lt;span class=&quot;hljs-subst&quot;&gt;${name}&lt;/span&gt;!`&lt;/span&gt;;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;css&quot;&gt;CSS&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;hljs language-css&quot;&gt;&lt;span class=&quot;hljs-selector-pseudo&quot;&gt;:root&lt;/span&gt; {
  &lt;span class=&quot;hljs-attr&quot;&gt;--color-bg&lt;/span&gt;: &lt;span class=&quot;hljs-number&quot;&gt;#f4f4f0&lt;/span&gt;;
  &lt;span class=&quot;hljs-attr&quot;&gt;--color-text&lt;/span&gt;: &lt;span class=&quot;hljs-number&quot;&gt;#1a1a1a&lt;/span&gt;;
  &lt;span class=&quot;hljs-attr&quot;&gt;--color-accent&lt;/span&gt;: &lt;span class=&quot;hljs-number&quot;&gt;#007070&lt;/span&gt;;
}

&lt;span class=&quot;hljs-selector-class&quot;&gt;.container&lt;/span&gt; {
  &lt;span class=&quot;hljs-attribute&quot;&gt;max-width&lt;/span&gt;: &lt;span class=&quot;hljs-number&quot;&gt;720px&lt;/span&gt;;
  &lt;span class=&quot;hljs-attribute&quot;&gt;margin&lt;/span&gt;: &lt;span class=&quot;hljs-number&quot;&gt;0&lt;/span&gt; auto;
  &lt;span class=&quot;hljs-attribute&quot;&gt;padding&lt;/span&gt;: &lt;span class=&quot;hljs-number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;hljs-number&quot;&gt;1rem&lt;/span&gt;;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;sql&quot;&gt;SQL&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;hljs language-sql&quot;&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;select&lt;/span&gt; title, slug, published_at
&lt;span class=&quot;hljs-keyword&quot;&gt;from&lt;/span&gt; posts
&lt;span class=&quot;hljs-keyword&quot;&gt;where&lt;/span&gt; is_published &lt;span class=&quot;hljs-operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hljs-literal&quot;&gt;true&lt;/span&gt;
  &lt;span class=&quot;hljs-keyword&quot;&gt;and&lt;/span&gt; published_at &lt;span class=&quot;hljs-operator&quot;&gt;&amp;#x3C;=&lt;/span&gt; now()
&lt;span class=&quot;hljs-keyword&quot;&gt;order&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot;&gt;by&lt;/span&gt; published_at &lt;span class=&quot;hljs-keyword&quot;&gt;desc&lt;/span&gt;
limit &lt;span class=&quot;hljs-number&quot;&gt;10&lt;/span&gt;;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;bash&quot;&gt;Bash&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;hljs language-bash&quot;&gt;&lt;span class=&quot;hljs-meta&quot;&gt;#!/bin/bash&lt;/span&gt;
&lt;span class=&quot;hljs-built_in&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;hljs-string&quot;&gt;&quot;Deploying...&quot;&lt;/span&gt;
npm run build
rsync -avz dist/ server:/var/www/blog/
&lt;span class=&quot;hljs-built_in&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;hljs-string&quot;&gt;&quot;Done.&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;inline-code&quot;&gt;Inline Code&lt;/h2&gt;
&lt;p&gt;Use &lt;code&gt;npm run dev&lt;/code&gt; to start the dev server. The config lives in &lt;code&gt;src/lib/config.ts&lt;/code&gt;. Environment variables go in &lt;code&gt;.env&lt;/code&gt;.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Features of This Blog</title>
    <link href="https://faffweasel.com/posts/features-of-this-blog" rel="alternate" type="text/html"/>
    <id>https://faffweasel.com/posts/features-of-this-blog</id>
    <published>2026-04-30T05:33:28.286Z</published>
    <updated>2026-05-06T05:33:28.286Z</updated>
    <author>
      <name>Phill</name>
    </author>
    <content type="html">&lt;p&gt;This blog runs on a self-hostable engine with a few features worth showing off. This post is a quick tour.&lt;/p&gt;
&lt;h2 id=&quot;typography&quot;&gt;Typography&lt;/h2&gt;
&lt;p&gt;Body text is set in the theme&apos;s body font. &lt;strong&gt;Bold&lt;/strong&gt;, &lt;em&gt;italic&lt;/em&gt;, &lt;del&gt;strikethrough&lt;/del&gt;, and &lt;code&gt;inline code&lt;/code&gt; all work as expected. Here&apos;s a &lt;a href=&quot;/blog&quot;&gt;link to the blog archive&lt;/a&gt; and an &lt;a href=&quot;https://example.com&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;external link&lt;/a&gt; that opens in a new tab.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Blockquotes are useful for pulling out a key point. They can span multiple lines and contain &lt;strong&gt;formatting&lt;/strong&gt; just like regular text.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;lists&quot;&gt;Lists&lt;/h2&gt;
&lt;p&gt;Unordered:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;First item&lt;/li&gt;
&lt;li&gt;Second item with a longer description that wraps to demonstrate line height and indentation&lt;/li&gt;
&lt;li&gt;Third item&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ordered:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Clone the repository&lt;/li&gt;
&lt;li&gt;Set up the database&lt;/li&gt;
&lt;li&gt;Configure your settings&lt;/li&gt;
&lt;li&gt;Deploy&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;horizontal-rule&quot;&gt;Horizontal Rule&lt;/h2&gt;
&lt;p&gt;Content above.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Content below.&lt;/p&gt;
&lt;h2 id=&quot;footnotes&quot;&gt;Footnotes&lt;/h2&gt;
&lt;p&gt;This engine supports footnotes&lt;sup&gt;&lt;a href=&quot;#user-content-fn-1&quot; id=&quot;user-content-user-content-fnref-1&quot; data-footnote-ref aria-describedby=&quot;user-content-footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; which are useful for citations and asides&lt;sup&gt;&lt;a href=&quot;#user-content-fn-2&quot; id=&quot;user-content-user-content-fnref-2&quot; data-footnote-ref aria-describedby=&quot;user-content-footnote-label&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;section data-footnotes class=&quot;footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;user-content-footnote-label&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-user-content-fn-1&quot;&gt;
&lt;p&gt;Footnotes appear at the bottom of the post. &lt;a href=&quot;#user-content-fnref-1&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-user-content-fn-2&quot;&gt;
&lt;p&gt;They&apos;re auto-numbered and linked both ways. &lt;a href=&quot;#user-content-fnref-2&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 2&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;</content>
  </entry>
  <entry>
    <title>Start Here</title>
    <link href="https://faffweasel.com/posts/start-here" rel="alternate" type="text/html"/>
    <id>https://faffweasel.com/posts/start-here</id>
    <published>2026-04-29T05:33:28.286Z</published>
    <updated>2026-05-06T05:33:28.286Z</updated>
    <author>
      <name>Phill</name>
    </author>
    <content type="html">&lt;p&gt;Welcome to Tintype, a self-hostable blog engine.&lt;/p&gt;
&lt;p&gt;The posts and pages on this blog are examples showing what Tintype can do. Delete them when you&apos;re ready, or keep them around as reference.&lt;/p&gt;
&lt;p&gt;A suggested tour:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/posts/features-of-this-blog&quot;&gt;Features of This Blog&lt;/a&gt;: overview of what Tintype supports&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/code-and-syntax-highlighting&quot;&gt;Code and Syntax Highlighting&lt;/a&gt;: for developer-oriented writing&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/tables-and-structured-content&quot;&gt;Tables and Structured Content&lt;/a&gt;: markdown tables, task lists, TOCs&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/images-and-embeds&quot;&gt;Images and Embeds&lt;/a&gt;: image handling and link embeds&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/template-variables&quot;&gt;Template Variables&lt;/a&gt;: dynamic content in posts and pages&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can edit anything from the admin panel. Start there, or just start writing.&lt;/p&gt;</content>
  </entry>
</feed>
