<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/rss.xml.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>iammatthias — #self-hosting</title><description>Entries tagged self-hosting.</description><link>https://iammatthias.com/</link><language>en-us</language><item><title>Intern</title><link>https://iammatthias.com/posts/1781835006151-intern/</link><guid isPermaLink="true">https://iammatthias.com/posts/1781835006151-intern/</guid><description>The Autonomous Intern ships as a Raspberry Pi 5 in a desk-toy case running a stack I didn&apos;t pick. I flashed it to Debian Trixie, swapped the whole thing for the Hermes agent with its own built-in memory, and folded it all into one setup script.</description><pubDate>Fri, 19 Jun 2026 02:10:06 GMT</pubDate><content:encoded>&lt;p&gt;Ah, the Autonomous Intern. A glorious little housing meant to sit on your desk with its LEDs flashing, letting you know it&amp;#39;s hard at work on whatever you threw at the agent it&amp;#39;s running.&lt;/p&gt;
&lt;p&gt;Out of the box, the Intern is a Raspberry Pi 5 with 4 GB of RAM and a 64 GB SD card. It ships with a factory install (the docs imply Debian Bookworm), and when you plug it in, it boots into access point mode. You connect to its wifi network (&lt;code&gt;Intern-XXXX&lt;/code&gt;) and set it up from there.&lt;/p&gt;
&lt;p&gt;You can also pop the case open by removing four screws, minding the wires for the LED array. With some tweezers you can pop the SD card and flash it with whatever you want. It&amp;#39;s a Pi! Have some fun with it.&lt;/p&gt;
&lt;p&gt;Well, I had some fun with it. I reworked the &lt;a href=&quot;https://cdn.autonomous.ai/intern/setup.sh&quot;&gt;setup script&lt;/a&gt; Autonomous provides with some defaults that I preferred:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Debian Trixie instead of Bookworm&lt;/li&gt;
&lt;li&gt;Caddy instead of nginx&lt;/li&gt;
&lt;li&gt;Hermes instead of OpenClaw (the stock default)&lt;/li&gt;
&lt;li&gt;Supermemory dropped for the default Hermes memory (&lt;a href=&quot;https://x.com/Teknium/status/2067030389538083183&quot;&gt;recommended by Teknium, who leads Hermes&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;The agent&lt;/h2&gt;
&lt;p&gt;The brain is now &lt;a href=&quot;https://github.com/NousResearch/hermes-agent&quot;&gt;Hermes&lt;/a&gt;, the agent from Nous Research. It runs as a gateway service on the Pi and talks over whatever channels you wire up. Bring your own model (I point it at OpenRouter) and pick it in a little web dashboard. Caddy sits out front, serving the setup page and proxying the backend. Nothing fancy, just the parts I trust doing the jobs I want.&lt;/p&gt;
&lt;h2&gt;Memory&lt;/h2&gt;
&lt;p&gt;This is the part I went back and forth on. I started by self-hosting &lt;a href=&quot;https://github.com/plastic-labs/honcho&quot;&gt;Honcho&lt;/a&gt; as a memory backend: Postgres, pgvector, Redis, a deriver worker, the whole Docker stack. It worked, and it was also a fragile, RAM-hungry pile of moving parts for what it actually bought me on a 4 GB Pi.&lt;/p&gt;
&lt;p&gt;So I ripped it out. The default Hermes memory is just a small &lt;code&gt;MEMORY.md&lt;/code&gt; the agent keeps current, plus skills it writes for itself. No vector database, no embeddings bill, and a lot less to run.&lt;/p&gt;
&lt;h2&gt;Reaching it&lt;/h2&gt;
&lt;p&gt;The Intern lives on my desk, but I don&amp;#39;t want to be at my desk to use it. &lt;a href=&quot;https://tailscale.com&quot;&gt;Tailscale&lt;/a&gt; handles that. The dashboard is published to my tailnet only, SSH goes over the tailnet, and a firewall locks the rest down so nothing interesting is exposed to the local network. From my phone or my laptop, anywhere, it&amp;#39;s just there.&lt;/p&gt;
&lt;h2&gt;The LEDs&lt;/h2&gt;
&lt;p&gt;Those flashing LEDs aren&amp;#39;t just for show. The backend drives the ring to track what the agent is doing. On my build, getting it to follow Hermes took a small bridge that feeds Hermes&amp;#39; activity to the backend&amp;#39;s LED API, so the ring breathes one color when it&amp;#39;s idle, another while it&amp;#39;s thinking, another while it&amp;#39;s running a tool.&lt;/p&gt;
&lt;h2&gt;The Rabbit R1&lt;/h2&gt;
&lt;p&gt;There&amp;#39;s one more goodie in the script: a shim that lets you pair a &lt;a href=&quot;https://www.rabbit.tech&quot;&gt;Rabbit R1&lt;/a&gt; to the Intern using the R1&amp;#39;s built-in OpenClaw pairing. Scan a QR and the R1 becomes a pocket remote for the agent. I wrote that part up on its own: &lt;a href=&quot;https://iammatthias.com/posts/1775069974473-replacing-rabbit-s-brain-connecting-a-rabbit-r1-to-hermes&quot;&gt;Replacing Rabbit&amp;#39;s Brain&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;One script&lt;/h2&gt;
&lt;p&gt;It&amp;#39;s all one script. Flash a Raspberry Pi 5 with Debian Trixie, run it, and you get the whole stack: agent, web layer, memory, remote access, LEDs, and the optional R1 channel. It&amp;#39;s idempotent, so you can re-run it without thinking too hard, and it works out on its own whether to run wifi onboarding or use a connection you&amp;#39;ve already got.&lt;/p&gt;
&lt;p&gt;Repo&amp;#39;s here: &lt;a href=&quot;https://github.com/iammatthias/intern&quot;&gt;github.com/iammatthias/intern&lt;/a&gt;.&lt;/p&gt;
</content:encoded><category>Posts</category><category>raspberry-pi</category><category>hardware</category><category>ai-agents</category><category>self-hosting</category><category>side-projects</category><category>hermes</category></item><item><title>Farfield</title><link>https://iammatthias.com/posts/1779066375000-farfield/</link><guid isPermaLink="true">https://iammatthias.com/posts/1779066375000-farfield/</guid><description>Five small Go services, single binaries, content-addressed records, running on my homelab. The new backend for the site.</description><pubDate>Mon, 18 May 2026 01:06:15 GMT</pubDate><content:encoded>&lt;p&gt;If you&amp;#39;ve followed along at all you&amp;#39;ll be aware of the various evolutions this site has undergone. From Wordpress to a Ghost blog built around a template from Themeforest, Squarespace, Hugo, Gatsby, NextJS, and now Astro. And for each framework in the mix, there has been a revolving door of backend. Flat files, a private GitHub repo read over the GraphQL API, a single-user PDS. The frontend changed and the backend changed under it, year after year.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;1670659200001-obsidian-as-a-cms.md&quot;&gt;Obsidian as a CMS&lt;/a&gt; carried me the longest. Write in Obsidian, sync to a private repo, query GitHub&amp;#39;s GraphQL API from the frontend, render the markdown. It was cheap, it was mine, and for a few years it did the job. The rough edges stayed rough. Tag aggregation lived in a hacky flat file. Images went through a plugin. There was no real notion of a record, just files in folders.&lt;/p&gt;
&lt;p&gt;A friend had been building everything on a personalized Rust stack, &lt;a href=&quot;https://github.com/stevedylandev/andromeda&quot;&gt;andromeda&lt;/a&gt; and a thin slice of dependencies. I wanted that shape for my content. So I built my own CRUD apps. Not a new concept. This collection is mine.&lt;/p&gt;
&lt;h2&gt;farfield&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/iammatthias/farfield&quot;&gt;farfield&lt;/a&gt; is a set of small, single-binary Go services. Each one is an HTML admin UI for writing and moderating content, plus a public JSON API the website reads.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;apex&lt;/code&gt; serves the landing page. &lt;code&gt;content&lt;/code&gt; holds collections, entries, and series fragments. &lt;code&gt;feed&lt;/code&gt; holds short ephemeral posts. &lt;code&gt;blobs&lt;/code&gt; stores image bytes and metadata on Cloudflare R2. A fifth service, &lt;code&gt;backup&lt;/code&gt;, runs tailnet-only and snapshots every database into R2 on a schedule.&lt;/p&gt;
&lt;p&gt;The stack is the Go standard library plus one dependency: &lt;code&gt;modernc.org/sqlite&lt;/code&gt;, a pure-Go SQLite driver. No cgo, so every build is a static binary. HTTP is &lt;code&gt;net/http&lt;/code&gt;, templates are &lt;code&gt;html/template&lt;/code&gt;, assets get embedded with &lt;code&gt;embed&lt;/code&gt;. It&amp;#39;s a Go adaptation of andromeda&amp;#39;s shape, standard library first, one deliberate dependency.&lt;/p&gt;
&lt;h2&gt;Three ideas&lt;/h2&gt;
&lt;p&gt;Every record carries a CID, a sha-256 hash of its content. The slug is the stable key and never changes. The CID changes whenever the content does, which makes change detection, ETag caching, and verification fall out for free. &lt;a href=&quot;1767505149657-notes-on-using-a-pds-as-content-infrastructure.md&quot;&gt;Content addressing on a PDS&lt;/a&gt; sold me on this, and I wanted it here too.&lt;/p&gt;
&lt;h2&gt;A private IPFS&lt;/h2&gt;
&lt;p&gt;I do devrel at &lt;a href=&quot;http://pinata.cloud/&quot;&gt;Pinata&lt;/a&gt;, so content addressing is the day job. IPFS is good. The DHT, the gateways, the pinning network, all of that is more than a personal site needs.&lt;/p&gt;
&lt;p&gt;farfield keeps the part that earns its place. The CIDs are CIDv1, sha-256, the same identifiers IPFS would mint. They live as columns in SQLite and serve over plain HTTPS. Content addressing without the network. A private IPFS, shaped to one site.&lt;/p&gt;
&lt;p&gt;A blob&amp;#39;s CID is the hash of its bytes, so &lt;code&gt;/blobs/{cid}&lt;/code&gt; is immutable and caches forever.&lt;/p&gt;
&lt;h2&gt;How it runs&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;docker compose&lt;/code&gt; builds each app into a &lt;code&gt;distroless/static&lt;/code&gt; image. Production is my homelab server, exposed through a Cloudflare tunnel. Reads are public and send &lt;code&gt;Access-Control-Allow-Origin: *&lt;/code&gt;, so Astro fetches them straight from the browser. Writes need an &lt;code&gt;X-API-Key&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The site is rebuilt around this now. Astro reads three JSON APIs instead of cloning a markdown repo at build time. Entry bodies embed &lt;code&gt;blob://&lt;/code&gt; and &lt;code&gt;series://&lt;/code&gt; URIs that resolve to real URLs before rendering.&lt;/p&gt;
&lt;p&gt;The home server those services run on is its own story. That&amp;#39;s a post for later.&lt;/p&gt;
</content:encoded><category>Posts</category><category>development</category><category>go</category><category>cms</category><category>self-hosting</category><category>content-addressing</category><category>ipfs</category><category>sqlite</category><category>astro</category><category>homelab</category></item></channel></rss>