<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>moutonlab.eu/blog</title>
  <link href="https://blog.moutonlab.eu/feed.xml" rel="self"/>
  <link href="https://blog.moutonlab.eu/"/>
  <updated>2026-05-14T22:21:01.855646+00:00</updated>
  <author><name>Menno Schaap</name><uri>https://bsky.app/profile/menno.moutonlab.eu</uri></author>
  <id>https://blog.moutonlab.eu/</id>

  <entry>
    <title>Setting up my self-hosted PDS</title>
    <link href="https://blog.moutonlab.eu/posts/setting-up-my-self-hosted-pds/"/>
    <id>https://blog.moutonlab.eu/posts/setting-up-my-self-hosted-pds/</id>
    <updated>2026-05-15T22:30:00+00:00</updated>
    <published>2026-05-15T22:30:00+00:00</published>
    
    <content type="html"><![CDATA[<h1>Setting up my self-hosted PDS</h1>
<p>A short note marking the moment.</p>
<h2 id="what-i-built-today">What I built today</h2>
<p>A self-hosted Bluesky Personal Data Server on a Hetzner CAX11 VPS in Falkenstein, registered to my holding company, hardened against the most common attack surfaces, and joined to the atproto network under my own domain handle: <a href="https://bsky.app/profile/menno.moutonlab.eu" rel="noopener noreferrer">menno.moutonlab.eu</a>.</p>
<p>This blog post itself is a test of the pipeline. The Markdown source lives in <code>~/spos/publications/</code>, the CLI publishes it to two channels in one command: a record on the PDS (visible to anyone with an atproto blog reader like WhiteWind), and static HTML on this site (<code>blog.moutonlab.eu</code>).</p>
<h2 id="what-i-learned">What I learned</h2>
<p>A few things stand out as worth remembering:</p>
<ol>
<li>
<p><strong>Sovereign infrastructure is reachable for one person.</strong> A €4.49/month VPS, careful attention to the threat model, and a few hours got me from &quot;Bluesky account on someone else's server&quot; to &quot;Bluesky account on infrastructure I own.&quot; Not free — there is real ongoing operational cost — but achievable.</p>
</li>
<li>
<p><strong>The protocol is more interesting than the app.</strong> Bluesky-the-application is one frontend onto the AT Protocol. Whitewind reads the same data my custom blog renderer reads. If either disappears tomorrow, the records persist on my PDS.</p>
</li>
<li>
<p><strong>Hardening is iterative.</strong> Every layer added something — SSH key-only auth, fail2ban, UFW rate limits, security headers, Docker capability dropping, read-only container roots, audit rules, sysadmin user separation. None of these matter individually as much as they matter together.</p>
</li>
<li>
<p><strong>The supply chain is the threat model.</strong> The interesting risks aren't bored kids running nmap — they are upstream package compromise, dependency drift, vendored projects going dark. Choosing what to trust + when to vendor + when to audit is the actual security work.</p>
</li>
</ol>
<h2 id="what-s-next">What's next</h2>
<p>Posts will appear here as I learn things worth writing down. The Markdown files live in <code>~/spos/publications/</code>; this site is just one rendering of them.</p>
<p>Hello world.</p>
]]></content>
  </entry>

</feed>
