{
  "version": "https://jsonfeed.org/version/1",
  "title": "Marmite 0.3.2",
  "home_page_url": "https://marmite.blog",
  "feed_url": "https://marmite.blog/tag-atproto.json",
  "description": "Static Site Generator <br> <small>for blogs</small> <br> <small>made with ❤️ and 🦀</small>",
  "items": [
    {
      "id": "https://marmite.blog/atproto-standard-site.html",
      "url": "https://marmite.blog/atproto-standard-site.html",
      "title": "AT Protocol standard.site",
      "content_html": "<p>Marmite natively supports publishing your blog posts using the decentralized <a href=\"https://atproto.com\">AT Protocol</a> and the <a href=\"https://standard.site\">standard.site</a> lexicons. This enables your posts to be discovered, read, and interacted with (e.g., inside the <a href=\"https://bsky.app\">Bluesky</a>) across the decentralized web while keeping your Marmite site as the canonical source.</p>\n<hr />\n<h2><a href=\"#setup--configuration\" aria-hidden=\"true\" class=\"anchor\" id=\"setup--configuration\"></a>Setup &amp; Configuration</h2>\n<p>To enable the AT Protocol features, add the <code>atproto</code> configuration block to your <code>marmite.yaml</code>:</p>\n<pre class=\"marmite-code\"><code class=\"marmite-code-inner language-yaml\"><a-pr>name</a-pr><a-p>:</a-p> <a-s>&quot;My Blog&quot;</a-s>\n<a-pr>url</a-pr><a-p>:</a-p> <a-s>&quot;https://myblog.com&quot;</a-s>\n\n<a-pr>atproto</a-pr><a-p>:</a-p>\n  <a-pr>handle</a-pr><a-p>:</a-p> <a-s>&quot;myhandle.bsky.social&quot;</a-s>\n  <a-pr>publication_uri</a-pr><a-p>:</a-p> <a-s>&quot;at://did:plc:.../site.standard.publication/...&quot;</a-s>\n  <a-pr>publish_content</a-pr><a-p>:</a-p> <a-co>true</a-co></code></pre>\n<table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>handle</code></td>\n<td>Yes</td>\n<td>Your AT Protocol handle (e.g. <code>yourname.bsky.social</code> or a custom domain handle)</td>\n</tr>\n<tr>\n<td><code>publication_uri</code></td>\n<td>Yes</td>\n<td>The AT-URI of your publication. You should register this publication externally (e.g., using a client like <a href=\"https://standard.horse\">standard.horse</a>, <a href=\"https://cuducos.tngl.io/std-pub\">std-pub</a>, or the <a href=\"https://github.com/bluesky-social/goat\"><code>goat</code> CLI</a>)</td>\n</tr>\n<tr>\n<td><code>publish_content</code></td>\n<td>No</td>\n<td>If <code>true</code>, Marmite will strip HTML tags from your compiled markdown and publish the post body text up to 10,000 characters as <code>textContent</code> to the AT Protocol record (defaults to <code>true</code>)</td>\n</tr>\n</tbody>\n</table>\n<hr />\n<h2><a href=\"#authentication\" aria-hidden=\"true\" class=\"anchor\" id=\"authentication\"></a>Authentication</h2>\n<p>Before publishing, you must authenticate Marmite with your <a href=\"https://atproto.com/guides/going-to-production#pds\"><abbr title=\"Personal Data Server\">PDS</abbr></a>.</p>\n<p>First, ensure <code>atproto.handle</code> is configured in your <code>marmite.yaml</code>.</p>\n<p>Next, create an <em>App Password</em> for your account (e.g., in Bluesky go to <em>Settings, App Passwords</em>).</p>\n<p>Export the password in your environment:</p>\n<pre class=\"marmite-code\"><code class=\"marmite-code-inner language-bash\"><a-k>export</a-k> <a-pr>ATPROTO_APP_PASSWORD</a-pr>=<a-s>&quot;xxxx-xxxx-xxxx-xxxx&quot;</a-s></code></pre>\n<p>Finally, run the authentication subcommand pointing to your site's directory:</p>\n<pre class=\"marmite-code\"><code class=\"marmite-code-inner language-bash\"><a-f>marmite</a-f> <a-o>&lt;</a-o>site_folder<a-o>&gt;</a-o> atproto auth</code></pre>\n<h3><a href=\"#custom-pds--self-hosting-optional\" aria-hidden=\"true\" class=\"anchor\" id=\"custom-pds--self-hosting-optional\"></a>Custom PDS / Self-Hosting (Optional)</h3>\n<p>If you are self-hosting your PDS or if the automatic endpoint resolution fails, you can explicitly override the PDS endpoint using the <code>ATPROTO_PDS_URL</code> environment variable before authenticating:</p>\n<pre class=\"marmite-code\"><code class=\"marmite-code-inner language-bash\"><a-k>export</a-k> <a-pr>ATPROTO_PDS_URL</a-pr>=<a-s>&quot;https://my-custom-pds.com&quot;</a-s></code></pre>\n<p>Marmite will:</p>\n<ul>\n<li>Perform a decentralized DNS/HTTP lookup to resolve your handle to its Decentralized Identifier (DID).</li>\n<li>Query <code>plc.directory</code> to resolve your DID to your actual <abbr title=\"Personal Data Server\">PDS</abbr> endpoint.</li>\n<li>Acquire an authentication session from your <abbr title=\"Personal Data Server\">PDS</abbr> and save the credentials locally at <code>~/.config/marmite/credentials.json</code>.</li>\n</ul>\n<hr />\n<h2><a href=\"#local-site-build--verification\" aria-hidden=\"true\" class=\"anchor\" id=\"local-site-build--verification\"></a>Local Site Build &amp; Verification</h2>\n<p>When you compile your site using <code>marmite build</code> or run the dev server with <code>marmite serve</code>, Marmite automatically takes care of domain-level and page-level standard.site verification:</p>\n<h3><a href=\"#automatic-well-known-generation\" aria-hidden=\"true\" class=\"anchor\" id=\"automatic-well-known-generation\"></a>Automatic <code>.well-known</code> Generation</h3>\n<p>Marmite generates a verification file at:\n<code>/.well-known/site.standard.publication</code> in your output directory.\nThis file contains your <code>publication_uri</code>. Indexers and clients check this file on your domain to verify that you indeed own the AT Protocol publication record.</p>\n<h3><a href=\"#automatic-header-injection\" aria-hidden=\"true\" class=\"anchor\" id=\"automatic-header-injection\"></a>Automatic Header Injection</h3>\n<p>For the <strong>homepage and pages</strong>, the default templates automatically inject the publication discovery link:</p>\n<pre class=\"marmite-code\"><code class=\"marmite-code-inner language-html\"><a-p>&lt;</a-p><a-tg>link</a-tg> <a-at>rel</a-at>=&quot;<a-s>site.standard.publication</a-s>&quot; <a-at>href</a-at>=&quot;<a-s>at://did:plc:.../site.standard.publication/...</a-s>&quot;<a-p>&gt;</a-p></code></pre>\n<p>For <strong>posts</strong>, Marmite reads the state mapping from your published records and automatically injects the document link into the header of each post:</p>\n<pre class=\"marmite-code\"><code class=\"marmite-code-inner language-html\"><a-p>&lt;</a-p><a-tg>link</a-tg> <a-at>rel</a-at>=&quot;<a-s>site.standard.document</a-s>&quot; <a-at>href</a-at>=&quot;<a-s>at://did:plc:.../site.standard.document/...</a-s>&quot;<a-p>&gt;</a-p></code></pre>\n<hr />\n<h2><a href=\"#publishing-posts-publish\" aria-hidden=\"true\" class=\"anchor\" id=\"publishing-posts-publish\"></a>Publishing Posts (<code>publish</code>)</h2>\n<p>To publish your posts to your <abbr title=\"Personal Data Server\">PDS</abbr>, run:</p>\n<pre class=\"marmite-code\"><code class=\"marmite-code-inner language-bash\"><a-f>marmite</a-f> <a-o>&lt;</a-o>site_folder<a-o>&gt;</a-o> atproto publish</code></pre>\n<p>Also, check <code>--help</code> for more options.</p>\n<p>That command:</p>\n<ol>\n<li>Gathers all valid markdown posts (excluding drafts).</li>\n<li>Computes a content hash of each post to detect modifications.</li>\n<li>Authenticates with your <abbr title=\"Personal Data Server\">PDS</abbr> (using the saved PDS URL or overridden via the <code>ATPROTO_PDS_URL</code> environment variable).</li>\n<li>Performs <code>createRecord</code> (for new posts) or <code>putRecord</code> (for modified posts) under the <code>site.standard.document</code> collection in your repository.</li>\n<li>Saves the mapping of post slugs to AT-URIs inside <code>.marmite-atproto-state.json</code>.</li>\n</ol>\n<p>Subsequent site <code>marmite build</code> read this local state file and automatically inject the document AT-URIs into the compiled HTML heads.</p>\n<hr />\n<h2><a href=\"#customizing-templates-advanced\" aria-hidden=\"true\" class=\"anchor\" id=\"customizing-templates-advanced\"></a>Customizing Templates (Advanced)</h2>\n<p>If you are using a custom theme and want to manually inject standard.site tags, add the following to your HTML heads:</p>\n<h3><a href=\"#base-layout-basehtml-or-similar\" aria-hidden=\"true\" class=\"anchor\" id=\"base-layout-basehtml-or-similar\"></a>Base layout (<code>base.html</code> or similar):</h3>\n<pre class=\"marmite-code\"><code class=\"marmite-code-inner language-html\">{% if site.atproto and site.atproto.publication_uri %}\n<a-p>&lt;</a-p><a-tg>link</a-tg> <a-at>rel</a-at>=&quot;<a-s>site.standard.publication</a-s>&quot; <a-at>href</a-at>=&quot;<a-s>{{ site.atproto.publication_uri }}</a-s>&quot;<a-p>&gt;</a-p>\n{% endif %}</code></pre>\n<h3><a href=\"#content-layout-contenthtml-or-similar\" aria-hidden=\"true\" class=\"anchor\" id=\"content-layout-contenthtml-or-similar\"></a>Content layout (<code>content.html</code> or similar):</h3>\n<pre class=\"marmite-code\"><code class=\"marmite-code-inner language-html\">{% if content.at_uri %}\n<a-p>&lt;</a-p><a-tg>link</a-tg> <a-at>rel</a-at>=&quot;<a-s>site.standard.document</a-s>&quot; <a-at>href</a-at>=&quot;<a-s>{{ content.at_uri }}</a-s>&quot;<a-p>&gt;</a-p>\n{% endif %}</code></pre>\n<blockquote>\n<p>Please consider giving a ☆ on Marmite <a href=\"https://github.com/rochacbruno/marmite\">Github</a> repository, that helps a lot!</p>\n</blockquote>\n<!-- Contents from _markdown_footer.md are appended to every content -->\n<!-- _references.md is a file to gather all references together \nthis file is appended to every raw markdown.\n-->\n",
      "summary": "\"Complete guide to publishing your Marmite blog posts to the decentralized AT Protocol using the standard.site specification.\"",
      "date_published": "2026-06-17T00:00:00-00:00",
      "image": "media/atproto-standard-site.banner.jpg",
      "authors": [
        {
          "name": "Bruno Rocha",
          "url": "https://go.rocha.social/@bruno",
          "avatar": "https://github.com/rochacbruno.png"
        }
      ],
      "tags": [
        "docs",
        "atproto",
        "standard.site"
      ],
      "language": "en"
    }
  ]
}