<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Zackary Pedersen (Keoir)</title><link>https://keoir.dev/</link><description>I build networks and the software that runs on top of them, on the ground and off it.</description><language>en-us</language><managingEditor>keoir@keoir.dev (Zackary Pedersen)</managingEditor><webMaster>keoir@keoir.dev (Zackary Pedersen)</webMaster><copyright>2026 Zackary Pedersen</copyright><lastBuildDate>Thu, 30 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://keoir.dev/index.xml" rel="self" type="application/rss+xml"/><item><title>Notes on building keoir.dev</title><link>https://keoir.dev/writing/notes-on-building-keoir-dev/</link><pubDate>Thu, 30 Jul 2026 00:00:00 +0000</pubDate><guid>https://keoir.dev/writing/notes-on-building-keoir-dev/</guid><description>A short colophon: why this site is a single Hugo binary, self-hosted fonts, no tracking, and a strict CSP.</description><content:encoded><![CDATA[<p>This site is deliberately small. One binary builds it, it ships as static files,
and it has no runtime dependencies. Here is what is under the hood and why.</p>
<p>The generator is Hugo. It is a single Go binary with no node_modules and no
build server to keep alive, which matches how I run everything else. The output
is plain HTML and CSS that a web server hands out as files.</p>
<p>The CSS is hand written against a set of custom properties: colors, a type
scale, spacing, and motion durations all live in one token file, and nothing
downstream hardcodes a hex value. There is no Tailwind and no framework. Light
and dark modes both read from <code>prefers-color-scheme</code>, with a manual toggle that
persists in <code>localStorage</code>.</p>
<p>There is almost no JavaScript. The theme toggle is a few lines of vanilla JS,
and the home page signature animation is an SVG that draws itself with CSS. With
JavaScript disabled the whole site still renders and reads correctly.</p>
<p>Every font is self hosted and subset. No Google Fonts, no analytics, no third
party script of any kind. That keeps the home page under the performance budget
and, as a side effect, means there are no cookies and no consent banner to show.</p>
<p>Because nothing loads from another origin, the Content Security Policy is strict
by default: <code>default-src 'self'</code>. The one inline script that sets the theme
before first paint is allowed by its hash rather than by opening up the policy.</p>
<p>The whole thing is served from my own network over dual stack IPv6, HTTP/3 with
an HTTP/2 fallback, and TLS 1.3. Deploys are a git push. That is the entire
stack, and I would rather keep it that boring.</p>
]]></content:encoded></item></channel></rss>