<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:base="https://starostka.io/">
  <title>Benjamin Starostka Jakobsen</title>
  <link rel="alternate" href="https://starostka.io/writing"/>
  <link rel="self" href="https://starostka.io/feed.xml"/>
  <id>https://starostka.io/writing</id>
  <updated>2026-11-03T00:00:00Z</updated>
  <author><name>Benjamin Starostka Jakobsen</name></author>
  <rights>CC BY-SA 4.0</rights>
  <entry>
    <title>A blog again</title>
    <link rel="alternate" href="https://starostka.io/2026/11/03/hello"/>
    <id>https://starostka.io/2026/11/03/hello</id>
    <published>2026-11-03T00:00:00Z</published>
    <updated>2026-11-03T00:00:00Z</updated>
    <summary>Why this blog exists, how it is built, and where it runs.</summary>
    <content type="html">&lt;p&gt;This is the first post on starostka.io. I will write here about research
infrastructure: the machines, the Nix that declares them, and the things that
break between the two.&lt;/p&gt; &lt;h2 id=&quot;how-it-is-built&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-it-is-built&quot;&gt;How it is built&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;The site is a SvelteKit app that renders every page at build time. Each post is
a Markdown file named by its date, so this one is &lt;code&gt;posts/2026-11-03-hello.md&lt;/code&gt;. Nix builds the site into an OCI image, and the
image runs on a small Kubernetes cluster that is declared in the same
repository as every other machine I run.&lt;/p&gt; &lt;figure class=&quot;diagram&quot;&gt;&lt;svg width=&quot;396pt&quot; height=&quot;44pt&quot;
 viewBox=&quot;0.00 0.00 396.00 44.00&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot;&gt;
&lt;g id=&quot;graph0&quot; class=&quot;graph&quot; transform=&quot;scale(1 1) rotate(0) translate(4 40)&quot;&gt;
&lt;!-- post --&gt;
&lt;g id=&quot;node1&quot; class=&quot;node&quot;&gt;
&lt;title&gt;post&lt;/title&gt;
&lt;path fill=&quot;none&quot; stroke=&quot;black&quot; d=&quot;M56.34,-36C56.34,-36 12,-36 12,-36 6,-36 0,-30 0,-24 0,-24 0,-12 0,-12 0,-6 6,0 12,0 12,0 56.34,0 56.34,0 62.34,0 68.34,-6 68.34,-12 68.34,-12 68.34,-24 68.34,-24 68.34,-30 62.34,-36 56.34,-36&quot;/&gt;
&lt;text xml:space=&quot;preserve&quot; text-anchor=&quot;middle&quot; x=&quot;34.17&quot; y=&quot;-14.4&quot; font-family=&quot;Inter&quot; font-size=&quot;12.00&quot;&gt;posts/*.md&lt;/text&gt;
&lt;/g&gt;
&lt;!-- site --&gt;
&lt;g id=&quot;node2&quot; class=&quot;node&quot;&gt;
&lt;title&gt;site&lt;/title&gt;
&lt;path fill=&quot;none&quot; stroke=&quot;black&quot; d=&quot;M181.34,-36C181.34,-36 116.34,-36 116.34,-36 110.34,-36 104.34,-30 104.34,-24 104.34,-24 104.34,-12 104.34,-12 104.34,-6 110.34,0 116.34,0 116.34,0 181.34,0 181.34,0 187.34,0 193.34,-6 193.34,-12 193.34,-12 193.34,-24 193.34,-24 193.34,-30 187.34,-36 181.34,-36&quot;/&gt;
&lt;text xml:space=&quot;preserve&quot; text-anchor=&quot;middle&quot; x=&quot;148.84&quot; y=&quot;-14.4&quot; font-family=&quot;Inter&quot; font-size=&quot;12.00&quot;&gt;SvelteKit build&lt;/text&gt;
&lt;/g&gt;
&lt;!-- post&amp;#45;&amp;gt;site --&gt;
&lt;g id=&quot;edge1&quot; class=&quot;edge&quot;&gt;
&lt;title&gt;post&amp;#45;&amp;gt;site&lt;/title&gt;
&lt;path fill=&quot;none&quot; stroke=&quot;black&quot; d=&quot;M68.67,-18C76.34,-18 84.69,-18 93,-18&quot;/&gt;
&lt;polygon fill=&quot;black&quot; stroke=&quot;black&quot; points=&quot;92.72,-21.5 102.72,-18 92.72,-14.5 92.72,-21.5&quot;/&gt;
&lt;/g&gt;
&lt;!-- image --&gt;
&lt;g id=&quot;node3&quot; class=&quot;node&quot;&gt;
&lt;title&gt;image&lt;/title&gt;
&lt;path fill=&quot;none&quot; stroke=&quot;black&quot; d=&quot;M286.32,-36C286.32,-36 241.34,-36 241.34,-36 235.34,-36 229.34,-30 229.34,-24 229.34,-24 229.34,-12 229.34,-12 229.34,-6 235.34,0 241.34,0 241.34,0 286.32,0 286.32,0 292.32,0 298.32,-6 298.32,-12 298.32,-12 298.32,-24 298.32,-24 298.32,-30 292.32,-36 286.32,-36&quot;/&gt;
&lt;text xml:space=&quot;preserve&quot; text-anchor=&quot;middle&quot; x=&quot;263.83&quot; y=&quot;-14.4&quot; font-family=&quot;Inter&quot; font-size=&quot;12.00&quot;&gt;OCI image&lt;/text&gt;
&lt;/g&gt;
&lt;!-- site&amp;#45;&amp;gt;image --&gt;
&lt;g id=&quot;edge2&quot; class=&quot;edge&quot;&gt;
&lt;title&gt;site&amp;#45;&amp;gt;image&lt;/title&gt;
&lt;path fill=&quot;none&quot; stroke=&quot;black&quot; d=&quot;M193.53,-18C201.45,-18 209.74,-18 217.7,-18&quot;/&gt;
&lt;polygon fill=&quot;black&quot; stroke=&quot;black&quot; points=&quot;217.56,-21.5 227.56,-18 217.56,-14.5 217.56,-21.5&quot;/&gt;
&lt;/g&gt;
&lt;!-- cluster --&gt;
&lt;g id=&quot;node4&quot; class=&quot;node&quot;&gt;
&lt;title&gt;cluster&lt;/title&gt;
&lt;path fill=&quot;none&quot; stroke=&quot;black&quot; d=&quot;M376.32,-36C376.32,-36 346.32,-36 346.32,-36 340.32,-36 334.32,-30 334.32,-24 334.32,-24 334.32,-12 334.32,-12 334.32,-6 340.32,0 346.32,0 346.32,0 376.32,0 376.32,0 382.32,0 388.32,-6 388.32,-12 388.32,-12 388.32,-24 388.32,-24 388.32,-30 382.32,-36 376.32,-36&quot;/&gt;
&lt;text xml:space=&quot;preserve&quot; text-anchor=&quot;middle&quot; x=&quot;361.32&quot; y=&quot;-14.4&quot; font-family=&quot;Inter&quot; font-size=&quot;12.00&quot;&gt;yutani&lt;/text&gt;
&lt;/g&gt;
&lt;!-- image&amp;#45;&amp;gt;cluster --&gt;
&lt;g id=&quot;edge3&quot; class=&quot;edge&quot;&gt;
&lt;title&gt;image&amp;#45;&amp;gt;cluster&lt;/title&gt;
&lt;path fill=&quot;none&quot; stroke=&quot;black&quot; d=&quot;M298.77,-18C306.46,-18 314.67,-18 322.51,-18&quot;/&gt;
&lt;polygon fill=&quot;black&quot; stroke=&quot;black&quot; points=&quot;322.49,-21.5 332.49,-18 322.49,-14.5 322.49,-21.5&quot;/&gt;
&lt;/g&gt;
&lt;/g&gt;
&lt;/svg&gt;
&lt;/figure&gt; &lt;p&gt;The deployment of the site is one binding:&lt;/p&gt; &lt;pre class=&quot;shiki tokens&quot; style=&quot;background-color:var(--shiki-background);color:var(--shiki-foreground)&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;&amp;#123;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;  inventory&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;instances&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;blog&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; &amp;#123;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;    service&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;blog&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;    roles&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;default&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;platforms&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;yutani&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;settings&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; &amp;#123; &amp;#125;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;  &amp;#125;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt; &lt;h2 id=&quot;what-it-measures&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-it-measures&quot;&gt;What it measures&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;There is no analytics script on these pages. The &lt;a href=&quot;/readership&quot;&gt;readership&lt;/a&gt; page shows where posts were shared instead, from the
public Hacker News, Lobsters and Reddit listings.&lt;sup id=&quot;fnref-1&quot;&gt;&lt;a href=&quot;#fn-1&quot; class=&quot;footnote-ref&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;span class=&quot;sidenote&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;sidenote-number&quot;&gt;1&lt;/span&gt;The blog server fetches those listings once an hour.&lt;/span&gt;&lt;/p&gt; &lt;p&gt;The feed is at &lt;a href=&quot;/feed.xml&quot;&gt;/feed.xml&lt;/a&gt;.&lt;/p&gt; &lt;div class=&quot;footnotes&quot;&gt;&lt;hr/&gt; &lt;ol&gt;&lt;li id=&quot;fn-1&quot;&gt;The blog server fetches those listings once an hour.&lt;a href=&quot;#fnref-1&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;</content>
  </entry>
</feed>
