<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Homelab on Unfinished Side Projects</title><link>https://blog.jakesaunders.dev/tags/homelab/</link><description>Recent content in Homelab on Unfinished Side Projects</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Fri, 21 Aug 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.jakesaunders.dev/tags/homelab/index.xml" rel="self" type="application/rss+xml"/><item><title>Building an (almost) fully self-hosted, sandboxed, agentic software factory</title><link>https://blog.jakesaunders.dev/building-an-almost-fully-self-hosted-sandboxed-agentic-software-factory/</link><pubDate>Fri, 21 Aug 2026 00:00:00 +0000</pubDate><guid>https://blog.jakesaunders.dev/building-an-almost-fully-self-hosted-sandboxed-agentic-software-factory/</guid><description>&lt;img src="https://blog.jakesaunders.dev/building-an-almost-fully-self-hosted-sandboxed-agentic-software-factory/agentic-developer.png" alt="Featured image of post Building an (almost) fully self-hosted, sandboxed, agentic software factory" /&gt;&lt;blockquote&gt;
&lt;p&gt;tl;dr: It worked! From one prompt it created a repo, wrote the application and tests, got CI green, provisioned
Postgres and deployed the finished app behind HTTPS without another message from me.If you just wanna see the outcome
you can find a demo video at &lt;a class="link" href="#enough-of-all-that-show-me-the-goods" &gt;the bottom&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;LLMs got fun again! Maybe they always were and I was just stuck in the trough of disillusionment. Lately, whenever I
need a little tool, I just build it.&lt;/p&gt;
&lt;p&gt;I was in the gym the other day and wanted a weights tracker. The app I had in mind was about as CRUD-y as it gets, but
all the app store versions wanted £12 per month, so I just one-shotted one with Claude. Great fun, but giving an LLM
root access to my machine in auto mode still doesn&amp;rsquo;t sit right with me.&lt;/p&gt;
&lt;p&gt;So, the challenge: how can I create a fully remote agentic development environment where we structurally contain the LLM
rather than just trusting it? I want to give it an instruction and have it autonomously move through the
whole SDLC:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Researching the right stack and packages to use.&lt;/li&gt;
&lt;li&gt;Planning and writing the code and tests.&lt;/li&gt;
&lt;li&gt;Committing to Git, building and running a CI pipeline.&lt;/li&gt;
&lt;li&gt;Deploying the work to a &amp;lsquo;production&amp;rsquo; server with databases, o11y, and a domain with SSL.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All on my home server, without another cloud infrastructure bill. The only ongoing cost specific to this experiment is
a £20 Codex sub.&lt;/p&gt;
&lt;h2 id="the-servers"&gt;The Server(s)
&lt;/h2&gt;&lt;p&gt;&lt;img src="https://blog.jakesaunders.dev/building-an-almost-fully-self-hosted-sandboxed-agentic-software-factory/servers.jpg"
width="4268"
height="2965"
srcset="https://blog.jakesaunders.dev/building-an-almost-fully-self-hosted-sandboxed-agentic-software-factory/servers_hu_f2e04384c574c085.jpg 480w, https://blog.jakesaunders.dev/building-an-almost-fully-self-hosted-sandboxed-agentic-software-factory/servers_hu_f4bf96245150884f.jpg 1024w"
loading="lazy"
alt="The servers"
class="gallery-image"
data-flex-grow="143"
data-flex-basis="345px"
&gt;&lt;/p&gt;
&lt;p&gt;Here they are in all their glory.&lt;/p&gt;
&lt;p&gt;The one at the bottom is a 2014 dual-core i3 I&amp;rsquo;ve been running as a homelab for five years. It&amp;rsquo;s valiantly hosting this
blog and about 45 other Docker containers, from Pi-hole to a full Prometheus / Loki / Grafana stack. It also has port
443 forwarded from my router. I&amp;rsquo;d be miffed if an LLM broke it, so that&amp;rsquo;s not what we&amp;rsquo;re using today.&lt;/p&gt;
&lt;p&gt;The top one is a 2021 10th-gen i7 with 32GB RAM, bought fresh from eBay with nothing on it. Perfect.&lt;/p&gt;
&lt;h2 id="the-stack"&gt;The Stack
&lt;/h2&gt;&lt;p&gt;The core development stack is self-hosted through Coolify. Inference and integrations like Tailscale, Telegram, DNS and
ACME still leave the box. You could host inference too, but I don&amp;rsquo;t have the hardware and I&amp;rsquo;d rather OpenAI subsidise
my experiments.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Pi-hole&lt;/td&gt;
&lt;td&gt;Local DNS rules, with the side benefit of seeing less shitty advertising.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tailscale&lt;/td&gt;
&lt;td&gt;Makes my home network follow me around.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coolify&lt;/td&gt;
&lt;td&gt;A self-hosted, Heroku-style PaaS built on Docker.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Forgejo (with runners)&lt;/td&gt;
&lt;td&gt;Self-hosted Git and CI.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hermes (with WebUI)&lt;/td&gt;
&lt;td&gt;An OpenClaw-style virtual assistant, using Codex for inference.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Telegram&lt;/td&gt;
&lt;td&gt;Talk to the agent from the toilet or wherever.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Firecrawl (self-hosted)&lt;/td&gt;
&lt;td&gt;A scraping / translation layer between the agent and the web.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Porkbun (Registrar) &amp;amp; Let&amp;rsquo;s Encrypt&lt;/td&gt;
&lt;td&gt;A domain and on-the-fly SSL certificates.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Whatever else&lt;/td&gt;
&lt;td&gt;Postgres, Redis, whatever your apps need. It&amp;rsquo;s just Docker under the hood, innit?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="sources"&gt;Sources
&lt;/h2&gt;&lt;p&gt;This isn&amp;rsquo;t a full how-to guide. I could probably write an Ansible one-shot script to set it all up; leave an issue on
the GitHub repo below if you&amp;rsquo;d like one. If you&amp;rsquo;ve read this far, though, you can probably figure it out.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class="link" href="https://blog.jakesaunders.dev/self-host-coolify-on-hetzner/" target="_blank" rel="noopener"
&gt;Coolify Setup Blog&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;My Coolify-on-Hetzner setup guide.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class="link" href="https://github.com/JakeWritesCode/coolify-dockerfiles" target="_blank" rel="noopener"
&gt;Coolify Dockerfiles&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Production Dockerfiles that actually work on Coolify. Just add env vars.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class="link" href="https://github.com/awknode/hermes-agent-skills/tree/main/forgejo-cli" target="_blank" rel="noopener"
&gt;Forgejo Hermes Skill&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;A Hermes skill for the Forgejo CLI; just provide a key.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="networking"&gt;Networking
&lt;/h2&gt;&lt;p&gt;The first guardrail is obvious: it&amp;rsquo;s on its own metal. Hermes could &lt;code&gt;rm -rf /&lt;/code&gt; and at worst it would cost me a couple
of hours rebuilding it.&lt;/p&gt;
&lt;p&gt;The next layer of bombproofing is the network. My older server has port 443 forwarded from the router; this one doesn&amp;rsquo;t.
There&amp;rsquo;s no external ingress, cutting out a huge attack surface and all the internet background radiation from people
speculatively probing &lt;code&gt;/wp-admin&lt;/code&gt; on every DNS A record I set up.&lt;/p&gt;
&lt;p&gt;But, if there&amp;rsquo;s no ingress, how do I:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Get access to all our cool new apps on my phone?&lt;/li&gt;
&lt;li&gt;Generate an SSL cert at a vanity URL so I can access &lt;code&gt;https://cool-new-app.internal.jakeshomelab.me&lt;/code&gt;?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I have Tailscale set up with my older server as an exit node. When I&amp;rsquo;m away from home, selecting it routes my traffic
through that server and Pi-hole, which I&amp;rsquo;m using for custom DNS. Pi-hole lets you add dnsmasq rules like this:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;address=/internal.jakeshomelab.me/192.168.1.201
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Anything requesting &lt;code&gt;*.internal.jakeshomelab.me&lt;/code&gt; now resolves to my new server, where Coolify&amp;rsquo;s reverse proxy picks it
up and serves my shiny new services.&lt;/p&gt;
&lt;h3 id="ssl-certs"&gt;SSL Certs
&lt;/h3&gt;&lt;p&gt;With Caddy or Traefik and Docker labels, you can serve port 3000 on container X from
&lt;code&gt;https://my-service.internal.jakeshomelab.me&lt;/code&gt;. Point an A record at the server and it&amp;rsquo;ll contact Let&amp;rsquo;s Encrypt,
complete an ACME challenge and get an SSL cert. I learned this three years ago and it still seems like magic.&lt;/p&gt;
&lt;p&gt;The problem is the A record. I don&amp;rsquo;t want to publicly associate &lt;code&gt;my-service.internal.jakeshomelab.me&lt;/code&gt; with my IP,
whether people can access it or not. I want an SSL cert for a ghost service.&lt;/p&gt;
&lt;p&gt;To solve this problem, I turned to DNS-01. I&amp;rsquo;ll be honest this is new to me, but here&amp;rsquo;s how it works:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Buy a domain (in this case from Porkbun).&lt;/li&gt;
&lt;li&gt;Generate Porkbun API keys and add them to Coolify&amp;rsquo;s environment with write access to the domain.&lt;/li&gt;
&lt;li&gt;Modify Coolify&amp;rsquo;s Docker Compose file to use &lt;code&gt;lego&lt;/code&gt; and the Porkbun API:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#e6db74"&gt;&amp;#39;--certificatesresolvers.letsencrypt.acme.dnschallenge=true&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#e6db74"&gt;&amp;#39;--certificatesresolvers.letsencrypt.acme.dnschallenge.provider=porkbun&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#e6db74"&gt;&amp;#39;--log.level=INFO&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then, when I register a new URL, Traefik / Coolify:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Uses the Porkbun API to create a new TXT record at &lt;code&gt;_acme-challenge.my-service.internal.jakeshomelab.me&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Let&amp;rsquo;s Encrypt validates the challenge and issues a valid SSL cert.&lt;/li&gt;
&lt;li&gt;Traefik deletes it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That&amp;rsquo;s it! You now have a valid HTTPS URL, reachable within your tailnet, with no public A or AAAA record pointing to
the service. The hostname may still appear in public certificate-transparency logs, but the service is only reachable
from the tailnet.&lt;/p&gt;
&lt;p&gt;The best bit is that Coolify does this on the fly. Our agent can create a service at any subdomain and it&amp;rsquo;ll
✨magically✨ sort itself out.&lt;/p&gt;
&lt;p&gt;So, glue all this together and you get the following:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.jakesaunders.dev/building-an-almost-fully-self-hosted-sandboxed-agentic-software-factory/networking-setup.png"
width="1693"
height="929"
srcset="https://blog.jakesaunders.dev/building-an-almost-fully-self-hosted-sandboxed-agentic-software-factory/networking-setup_hu_779d3784b2e91c7b.png 480w, https://blog.jakesaunders.dev/building-an-almost-fully-self-hosted-sandboxed-agentic-software-factory/networking-setup_hu_eb0a9bf5674b756a.png 1024w"
loading="lazy"
alt="Networking diagram (A bit AI slop sorry!)"
class="gallery-image"
data-flex-grow="182"
data-flex-basis="437px"
&gt;&lt;/p&gt;
&lt;p&gt;The same setup covers the tooling, so Coolify, Hermes, Forgejo and Firecrawl all live on their own local subdomains.&lt;/p&gt;
&lt;h2 id="development-stack--mcps"&gt;Development Stack &amp;amp; MCPs
&lt;/h2&gt;&lt;p&gt;Now we have an isolated(ish) box, let&amp;rsquo;s move on to the tooling. The tools are well known; gluing them together is the
fun part.&lt;/p&gt;
&lt;h3 id="forgejo"&gt;Forgejo
&lt;/h3&gt;&lt;p&gt;We need somewhere durable to store code and run CI. I decided not to use GitHub because:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Giving the box my GitHub token rather undermines the isolation. Also, it&amp;rsquo;s not self-hosted.&lt;/li&gt;
&lt;li&gt;Its API and CI minute limits won&amp;rsquo;t work at the scale of our new software factory.&lt;/li&gt;
&lt;li&gt;It&amp;rsquo;s down most of the time these days anyway.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Forgejo is a great self-hosted alternative. The Docker Compose file linked above sets up Forgejo and its runners;
registering yourself and the runner takes a little extra work, but it&amp;rsquo;s well documented.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve also included a Compose file for syncing projects back to GitHub. That puts your GH token in the environment, but
the trade-off is yours to make.&lt;/p&gt;
&lt;p&gt;The Forgejo Hermes skill linked above gives the agent full control of the instance.&lt;/p&gt;
&lt;h3 id="hermes"&gt;Hermes
&lt;/h3&gt;&lt;p&gt;Hermes is an OpenClaw-style personal assistant with agentic capabilities. I never got in on the OpenClaw hype, so I
can&amp;rsquo;t compare the two, but Hermes has a few features I&amp;rsquo;ve found handy:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Web UI&lt;/strong&gt;: A standard ChatGPT-esque interface for working from my laptop and managing skills.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Shared filesystem&lt;/strong&gt;: I&amp;rsquo;ve mounted its workspace from the Docker host and shared it over Samba. The agent and I can
use the same files instead of copy-pasting Markdown and code around.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Telegram integration&lt;/strong&gt;: I can chat to the agent from my phone. Setup took two minutes and required no login details,
which suited the sandbox approach.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Self-building skills&lt;/strong&gt;: Hermes can create and register its own skills. I couldn&amp;rsquo;t find a good Coolify one, so it
read the docs, looked at the MCP and built one.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Firecrawl&lt;/strong&gt;: Self-hosted Firecrawl gives the agent much nicer access to SERP data and web scraping at scale.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Getting Hermes and Firecrawl set up with the right keys in the right places is a massive pain in the arse. I&amp;rsquo;ve added
Coolify-friendly Docker Compose files to the repo linked above.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.jakesaunders.dev/building-an-almost-fully-self-hosted-sandboxed-agentic-software-factory/hermes.png"
width="1713"
height="1288"
srcset="https://blog.jakesaunders.dev/building-an-almost-fully-self-hosted-sandboxed-agentic-software-factory/hermes_hu_e4bb6f9e04c3863a.png 480w, https://blog.jakesaunders.dev/building-an-almost-fully-self-hosted-sandboxed-agentic-software-factory/hermes_hu_6fbafe75adfadb90.png 1024w"
loading="lazy"
alt="Hermes chugging through building a demo web app for this blog post."
class="gallery-image"
data-flex-grow="132"
data-flex-basis="319px"
&gt;&lt;/p&gt;
&lt;h3 id="coolify"&gt;Coolify
&lt;/h3&gt;&lt;p&gt;Coolify is the glue holding this together: a self-hosted PaaS built on Docker and Compose that comes on in leaps and
bounds with every update. If you want Heroku or DigitalOcean App Platform niceties on your own hardware, I&amp;rsquo;d highly
recommend it.&lt;/p&gt;
&lt;p&gt;Some of my favourite features are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It&amp;rsquo;s just Docker under the hood. Existing deployments mostly work, and if Coolify won&amp;rsquo;t do something weird you can
&lt;code&gt;docker exec &amp;lt;whatever&amp;gt;&lt;/code&gt; from your laptop. Things are only abstracted away if you want them to be.&lt;/li&gt;
&lt;li&gt;The SSL / routing stack which I&amp;rsquo;ve gone into in depth above.&lt;/li&gt;
&lt;li&gt;Coolify ships with a bunch of pre-made recipes for all the most common apps. Postgres, Redis, Hermes, Forgejo and
almost anything else is available to deploy with a single click.&lt;/li&gt;
&lt;li&gt;Postgres backups to S3 are a three-click job, and env vars and user management are built in.&lt;/li&gt;
&lt;li&gt;GitHub webhooks give you automatic deploys on push to main.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here are a couple of screenshots of my Coolify setup in action:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.jakesaunders.dev/building-an-almost-fully-self-hosted-sandboxed-agentic-software-factory/coolify-tooling.png"
width="1695"
height="845"
srcset="https://blog.jakesaunders.dev/building-an-almost-fully-self-hosted-sandboxed-agentic-software-factory/coolify-tooling_hu_c754ea34f973314a.png 480w, https://blog.jakesaunders.dev/building-an-almost-fully-self-hosted-sandboxed-agentic-software-factory/coolify-tooling_hu_b2210fedb454978f.png 1024w"
loading="lazy"
alt="Tooling screen on Coolify"
class="gallery-image"
data-flex-grow="200"
data-flex-basis="481px"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.jakesaunders.dev/building-an-almost-fully-self-hosted-sandboxed-agentic-software-factory/coolify-service.png"
width="1699"
height="1285"
srcset="https://blog.jakesaunders.dev/building-an-almost-fully-self-hosted-sandboxed-agentic-software-factory/coolify-service_hu_d5cb1a5caa401887.png 480w, https://blog.jakesaunders.dev/building-an-almost-fully-self-hosted-sandboxed-agentic-software-factory/coolify-service_hu_26b1bb1f5dae2dee.png 1024w"
loading="lazy"
alt="Firecrawl service and Docker Compose"
class="gallery-image"
data-flex-grow="132"
data-flex-basis="317px"
&gt;&lt;/p&gt;
&lt;h2 id="what-it-actually-did"&gt;What it actually did
&lt;/h2&gt;&lt;p&gt;The demo below shows this pretty well, but the starting gun was the following prompt:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Please build me an app for tracking my calorie intake. It should be similar to MyFitnessPal but with a form to
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;add specific food and meals for quick selection later.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Your task is to build it, commit it to a new repo with tests, test it with CI, and deploy it to
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;http://calories.internal.jakeshomelab.me.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;I’d like it to be a full stack svelte kit app with Drizzle and Postgres for the database layer.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;I’d like tailwind for the CSS. It should be mobile first.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;For deployment, please use docker and docker compose and deploy your own Postgres instance.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;From there, it just got on with it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Created a new Git repo and bootstrapped SvelteKit, Drizzle, Postgres and Tailwind.&lt;/li&gt;
&lt;li&gt;Wrote the app and its tests, committing the work in sensible stages.&lt;/li&gt;
&lt;li&gt;Created a CI pipeline.&lt;/li&gt;
&lt;li&gt;Worked through test failures until CI turned green.&lt;/li&gt;
&lt;li&gt;Containerised the app and its own Postgres instance with Docker Compose.&lt;/li&gt;
&lt;li&gt;Deployed the lot to Coolify at its own URL.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All without a single further prompt. No nudging it through failed tests or copying error messages back into the chat.
It just kept going until the app was running.&lt;/p&gt;
&lt;p&gt;At that point I gave it a whirl and hit a CSRF issue when submitting data. I sent one more prompt; it diagnosed the
problem, fixed it, added regression tests and redeployed.&lt;/p&gt;
&lt;p&gt;And it worked!&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s the loop I wanted: prompt, repo, code, tests, CI, deployment, bug fix. It&amp;rsquo;s not a complicated app, obviously,
but it went from a paragraph to tested, deployed software and handled all the boring bits in between. That still feels
a bit like witchcraft.&lt;/p&gt;
&lt;h2 id="enough-of-all-that-show-me-the-goods"&gt;Enough of all that, show me the goods!
&lt;/h2&gt;&lt;p&gt;I&amp;rsquo;m no YouTuber, but here you go:&lt;/p&gt;
&lt;p&gt;&lt;video src="https://inventronix.lon1.cdn.digitaloceanspaces.com/demo_web.mp4" controls preload="metadata" playsinline style="width:100%; object-fit:contain"&gt;&lt;/video&gt;&lt;/p&gt;
&lt;h2 id="thoughts-on-isolation-and-next-steps"&gt;Thoughts on isolation and next steps
&lt;/h2&gt;&lt;p&gt;There is always a trade-off between fully agentic development and security. This was a fairly contrived example: the
app works completely in isolation. Most useful software talks to other software, which means handing over API keys,
and every key adds another little hole in the sandbox.&lt;/p&gt;
&lt;p&gt;Even in this setup, Hermes can still:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Nuke the new server and everything running on it.&lt;/li&gt;
&lt;li&gt;Delete repos, databases and deployments.&lt;/li&gt;
&lt;li&gt;Leak or abuse any credentials I&amp;rsquo;ve given it.&lt;/li&gt;
&lt;li&gt;Burn through inference tokens like its end-of-year review depends on it.&lt;/li&gt;
&lt;li&gt;Make rando outbound requests and download whatever rubbish the internet hands it.&lt;/li&gt;
&lt;li&gt;Poke anything else on my network that the firewall allows it to reach.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So no, it isn&amp;rsquo;t harmless. What I&amp;rsquo;ve done is make the machine sacrificial and sharply limit how much stuff I care about
is within reach. The failure mode is now &amp;ldquo;rebuild the eBay box and rotate a handful of keys&amp;rdquo;, rather than &amp;ldquo;discover an
LLM has enthusiastically reorganised my actual laptop&amp;rdquo;. That&amp;rsquo;s better I think, but it isn&amp;rsquo;t magic.&lt;/p&gt;
&lt;p&gt;The obvious next steps are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Put the box on its own VLAN and explicitly block access to the rest of my home network.&lt;/li&gt;
&lt;li&gt;Scope every credential as narrowly as the provider allows, and rotate them regularly.&lt;/li&gt;
&lt;li&gt;Automate backups and make rebuilding the whole box a one-shot job.
&lt;ul&gt;
&lt;li&gt;Coolify&amp;rsquo;s DB backup and my shared Docker compose mounts should make this relatively easy.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Require approval before it does anything genuinely public or difficult to undo.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At some point, though, enough approval gates turn your magical autonomous software factory back into a collection of
forms you
have to fill in. Finding the useful point between &amp;ldquo;needs me every five minutes&amp;rdquo; and &amp;ldquo;has the launch codes&amp;rdquo; is the next
experiment.&lt;/p&gt;</description></item></channel></rss>