<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Alex Waldmann — notes</title><description>Long-form notes on building and running software: Rust, protocols, self-hosting, and what small businesses actually need from their tools.</description><link>https://rockywearsahat.com/</link><item><title>This site is served by an HTTP server I wrote</title><link>https://rockywearsahat.com/blog/served-by-my-own-http-server/</link><guid isPermaLink="true">https://rockywearsahat.com/blog/served-by-my-own-http-server/</guid><description>What actually happens between your address bar and this paragraph, and why I own every step of it.</description><pubDate>Mon, 17 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;When you requested this page, no nginx answered. No Cloudflare terminated
your TLS session, no certbot renewed the certificate it ran over, and the
DNS answer that got you here didn’t come from a registrar’s console — it
came from a nameserver process I wrote, running on the same machine that
is talking to you now.&lt;/p&gt;
&lt;p&gt;That machine runs &lt;a href=&quot;/work/selfhost&quot;&gt;selfhost&lt;/a&gt;: 24 Rust crates that
implement, rather than import, the protocols a small platform needs. The
rule that shaped it is simple and a little unfashionable: &lt;em&gt;if the
protocol is the product, write the protocol.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;the-path-of-one-request&quot;&gt;The path of one request&lt;/h2&gt;
&lt;p&gt;Your resolver asked for &lt;code&gt;rockywearsahat.com&lt;/code&gt; and the authority
that answered is the &lt;code&gt;dns&lt;/code&gt; crate speaking the wire format from
RFC 1035 — name compression, the lot. The TCP connection landed on the
&lt;code&gt;proxy&lt;/code&gt; crate, which owns the sockets and does the routing that
a reverse proxy usually does. TLS came next:&lt;/p&gt;
&lt;pre class=&quot;astro-code vesper&quot; style=&quot;background-color:#101010;color:#FFF; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;rust&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8B8B8B94&quot;&gt;// the certificate this page arrived over was issued by this call —&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8B8B8B94&quot;&gt;// an ACME (RFC 8555) order placed by the machine, for the machine&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#A0A0A0&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color:#FFF&quot;&gt; order &lt;/span&gt;&lt;span style=&quot;color:#A0A0A0&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#FFC799&quot;&gt; acme&lt;/span&gt;&lt;span style=&quot;color:#A0A0A0&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color:#FFC799&quot;&gt;Order&lt;/span&gt;&lt;span style=&quot;color:#A0A0A0&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color:#FFC799&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color:#FFF&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#A0A0A0&quot;&gt;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#FFF&quot;&gt;account, &lt;/span&gt;&lt;span style=&quot;color:#A0A0A0&quot;&gt;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#FFF&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#99FFE4&quot;&gt;&quot;rockywearsahat.com&quot;&lt;/span&gt;&lt;span style=&quot;color:#FFF&quot;&gt;])&lt;/span&gt;&lt;span style=&quot;color:#A0A0A0&quot;&gt;?&lt;/span&gt;&lt;span style=&quot;color:#FFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#A0A0A0&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color:#FFF&quot;&gt; cert  &lt;/span&gt;&lt;span style=&quot;color:#A0A0A0&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#FFF&quot;&gt; order&lt;/span&gt;&lt;span style=&quot;color:#A0A0A0&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#FFC799&quot;&gt;finalize&lt;/span&gt;&lt;span style=&quot;color:#FFF&quot;&gt;(http01_responder)&lt;/span&gt;&lt;span style=&quot;color:#A0A0A0&quot;&gt;.await?&lt;/span&gt;&lt;span style=&quot;color:#FFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFF&quot;&gt;proxy&lt;/span&gt;&lt;span style=&quot;color:#A0A0A0&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#FFC799&quot;&gt;install&lt;/span&gt;&lt;span style=&quot;color:#FFF&quot;&gt;(cert);   &lt;/span&gt;&lt;span style=&quot;color:#8B8B8B94&quot;&gt;// no certbot, no cron, no vendor&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then an &lt;code&gt;HTTP/1.1 200&lt;/code&gt; from the &lt;code&gt;http&lt;/code&gt; crate, carrying
a page that was built statically and copied into place by the same platform.
Five hops, five pieces of code, one owner.&lt;/p&gt;
&lt;h2 id=&quot;why-bother&quot;&gt;Why bother&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The layers stop being magic.&lt;/strong&gt; Debugging a delivery
problem when you wrote the SMTP implementation is reading your own logs,
not guessing at someone else’s.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The dependency bill is visible.&lt;/strong&gt; The whole workspace
pulls 64 transitive packages. The policy admits an async runtime, a TLS
implementation, and config serialisation — nothing else.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;It is the résumé.&lt;/strong&gt; Anyone can claim systems experience;
this page is an existence proof that loads in under a second.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;A claim that cannot be checked against a repository, a live URL, or a
measurement does not ship. That rule built this site, and it wrote this
post’s numbers too.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;what-it-costs&quot;&gt;What it costs&lt;/h2&gt;
&lt;p&gt;Owning the stack means owning its outages. When the box loses power, the
site is down and the fault is mine — there is no status page to point at.
That trade is the point: the failure modes are all within reach of a
debugger I can attach. The platform rebuilds itself from every push to
&lt;code&gt;main&lt;/code&gt;, and this article reached you through that exact path —
drafted by an agent over MCP, validated against a schema, pushed, rebuilt,
served.&lt;/p&gt;</content:encoded><category>rust</category><category>http</category><category>selfhost</category><author>alex@rockywearsahat.com</author></item></channel></rss>