<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>RealFin</title><description>Homelab, self-hosting and game servers, written up from a real server in my room. Plus the story of building a Roblox game with AI.</description><link>https://realfin.dev/</link><item><title>How this blog is built: Astro + Cloudflare Pages for the price of a domain</title><link>https://realfin.dev/blog/building-this-blog-astro-cloudflare-pages/</link><guid isPermaLink="true">https://realfin.dev/blog/building-this-blog-astro-cloudflare-pages/</guid><description>A static site with search, tools, guest authors and ads, costing about €12 a year, with nothing exposed on my home server. The stack, the costs and the security decisions behind it.</description><pubDate>Thu, 15 Oct 2026 17:00:00 GMT</pubDate><category>homelab</category><category>astro</category><category>cloudflare</category><category>static-site</category><category>security</category><category>self-hosting</category><author>RealFin</author></item><item><title>Applying for Google AdSense with a brand-new static site: what actually happened</title><link>https://realfin.dev/blog/adsense-new-static-site-setup/</link><guid isPermaLink="true">https://realfin.dev/blog/adsense-new-static-site-setup/</guid><description>Owning the domain, the code snippet vs ads.txt, verification that failed for reasons that had nothing to do with my site, the EU consent message, and the rules that get accounts banned.</description><pubDate>Thu, 15 Oct 2026 16:30:00 GMT</pubDate><category>homelab</category><category>adsense</category><category>monetization</category><category>static-site</category><category>cloudflare</category><author>RealFin</author></item><item><title>A Cloudflare API token that can&apos;t hurt you (least privilege, IP lock, expiry)</title><link>https://realfin.dev/blog/cloudflare-api-token-least-privilege/</link><guid isPermaLink="true">https://realfin.dev/blog/cloudflare-api-token-least-privilege/</guid><description>How I scoped a Cloudflare API token to one domain, five permissions, my home IP and three months, so automation can manage DNS and redirects without being able to touch billing or the domain itself.</description><pubDate>Thu, 15 Oct 2026 16:00:00 GMT</pubDate><category>homelab</category><category>cloudflare</category><category>security</category><category>api</category><category>dns</category><author>RealFin</author></item><item><title>Free email on your own domain with Cloudflare Email Routing (receive-only)</title><link>https://realfin.dev/blog/cloudflare-email-routing-custom-domain/</link><guid isPermaLink="true">https://realfin.dev/blog/cloudflare-email-routing-custom-domain/</guid><description>hello@yourdomain forwarding to your normal inbox in five minutes: the DNS records it adds, verifying the destination, and the one privacy catch when you reply.</description><pubDate>Thu, 15 Oct 2026 15:30:00 GMT</pubDate><category>homelab</category><category>cloudflare</category><category>email</category><category>dns</category><category>privacy</category><author>RealFin</author></item><item><title>New DNS record works everywhere except at home? Negative caching</title><link>https://realfin.dev/blog/dns-negative-caching-new-subdomain/</link><guid isPermaLink="true">https://realfin.dev/blog/dns-negative-caching-new-subdomain/</guid><description>I added www to my domain and it worked on mobile data but not on my home network for half an hour. My own resolver had cached the &apos;doesn&apos;t exist&apos; answer. The one Unbound setting that fixes it.</description><pubDate>Thu, 15 Oct 2026 15:00:00 GMT</pubDate><category>homelab</category><category>dns</category><category>unbound</category><category>adguard</category><category>cloudflare</category><author>RealFin</author></item><item><title>My network ad blocker broke my own AdSense dashboard</title><link>https://realfin.dev/blog/adguard-blocked-my-own-adsense-dashboard/</link><guid isPermaLink="true">https://realfin.dev/blog/adguard-blocked-my-own-adsense-dashboard/</guid><description>Every button in Google AdSense did nothing. The cause was my AdGuard Home blocking Google&apos;s ad domains house-wide. How to confirm it, and how to unblock AdSense for just one PC.</description><pubDate>Thu, 15 Oct 2026 14:00:00 GMT</pubDate><category>homelab</category><category>adguard</category><category>dns</category><category>adsense</category><category>ad-blocking</category><author>RealFin</author></item><item><title>Prowlarr sync keeps failing with HTTP 400? Find the indexer Sonarr and Radarr reject</title><link>https://realfin.dev/blog/prowlarr-sync-400-bad-request/</link><guid isPermaLink="true">https://realfin.dev/blog/prowlarr-sync-400-bad-request/</guid><description>Prowlarr logged &apos;400 BadRequest&apos; when syncing indexers to Sonarr and Radarr several times a day. The culprit was one indexer that never returns movie or TV results. How to find it using the APIs.</description><pubDate>Thu, 15 Oct 2026 13:00:00 GMT</pubDate><category>homelab</category><category>prowlarr</category><category>sonarr</category><category>radarr</category><category>troubleshooting</category><category>media</category><author>RealFin</author></item><item><title>Zigbee2MQTT restarted 22,112 times, and Docker never told me</title><link>https://realfin.dev/blog/zigbee2mqtt-restart-loop-docker-network/</link><guid isPermaLink="true">https://realfin.dev/blog/zigbee2mqtt-restart-loop-docker-network/</guid><description>A container that lost its Docker network after a reboot, couldn&apos;t resolve the MQTT broker, and crash-looped for three days. How to spot it and fix it.</description><pubDate>Thu, 15 Oct 2026 12:40:00 GMT</pubDate><category>homelab</category><category>docker</category><category>zigbee2mqtt</category><category>home-assistant</category><category>mqtt</category><category>troubleshooting</category><author>RealFin</author></item><item><title>Certbot renewal failing every 12 hours: &apos;bind() to 0.0.0.0:80 failed&apos;</title><link>https://realfin.dev/blog/certbot-standalone-port-conflict/</link><guid isPermaLink="true">https://realfin.dev/blog/certbot-standalone-port-conflict/</guid><description>An old certbot setup kept failing because AdGuard and Nginx Proxy Manager own ports 80 and 443. Why standalone renewals break on a busy server, and the DNS-challenge alternative.</description><pubDate>Thu, 15 Oct 2026 12:30:00 GMT</pubDate><category>homelab</category><category>certbot</category><category>letsencrypt</category><category>nginx-proxy-manager</category><category>adguard</category><category>troubleshooting</category><author>RealFin</author></item><item><title>My homelab tour: one server, ~30 Docker containers</title><link>https://realfin.dev/blog/homelab-tour-30-containers/</link><guid isPermaLink="true">https://realfin.dev/blog/homelab-tour-30-containers/</guid><description>What runs on my home server, how it&apos;s organised with Docker Compose, and the lessons that shaped it.</description><pubDate>Thu, 15 Oct 2026 12:20:00 GMT</pubDate><category>homelab</category><category>docker</category><category>homelab</category><category>overview</category><author>RealFin</author></item><item><title>Docker logs ate 2.4 GB on my server. Here&apos;s how to cap them</title><link>https://realfin.dev/blog/docker-log-size-limits/</link><guid isPermaLink="true">https://realfin.dev/blog/docker-log-size-limits/</guid><description>Docker&apos;s json-file logs grow forever by default. Two lines in daemon.json fix it, but only for containers created afterwards.</description><pubDate>Thu, 15 Oct 2026 12:00:00 GMT</pubDate><category>homelab</category><category>docker</category><category>logs</category><category>disk-space</category><category>daemon.json</category><author>RealFin</author></item><item><title>Why Valheim crops don&apos;t grow on a dedicated server when nobody&apos;s online</title><link>https://realfin.dev/blog/valheim-crops-not-growing-empty-server/</link><guid isPermaLink="true">https://realfin.dev/blog/valheim-crops-not-growing-empty-server/</guid><description>I measured the world clock in the server&apos;s save files: it stops about 13 minutes after the last player leaves. Crops, smelters and kilns only progress while someone is connected.</description><pubDate>Thu, 15 Oct 2026 11:40:00 GMT</pubDate><category>game-servers</category><category>valheim</category><category>farming</category><category>dedicated-server</category><category>world-time</category><author>RealFin</author></item><item><title>Docker said 32 GB was reclaimable. The real number was closer to 3</title><link>https://realfin.dev/blog/docker-reclaimable-space-misleading/</link><guid isPermaLink="true">https://realfin.dev/blog/docker-reclaimable-space-misleading/</guid><description>docker system df claimed 92% of my image space could be freed. Checking image by image told a very different story. How to find what&apos;s actually unused before you prune anything.</description><pubDate>Thu, 15 Oct 2026 11:30:00 GMT</pubDate><category>homelab</category><category>docker</category><category>disk-space</category><category>cleanup</category><author>RealFin</author></item><item><title>Jellyfin &apos;fatal player error&apos; after an NVIDIA update: the driver/library mismatch</title><link>https://realfin.dev/blog/nvidia-driver-mismatch-jellyfin-transcoding/</link><guid isPermaLink="true">https://realfin.dev/blog/nvidia-driver-mismatch-jellyfin-transcoding/</guid><description>Ubuntu auto-updated the NVIDIA driver but kept the old kernel module loaded. GPU transcoding broke for weeks. Diagnosis and a reboot script that only reboots when needed.</description><pubDate>Thu, 15 Oct 2026 11:20:00 GMT</pubDate><category>homelab</category><category>jellyfin</category><category>nvidia</category><category>gpu</category><category>ubuntu</category><category>unattended-upgrades</category><author>RealFin</author></item><item><title>Why &apos;docker stop&apos; before a reboot left my whole homelab down for two days</title><link>https://realfin.dev/blog/docker-stop-before-reboot-mistake/</link><guid isPermaLink="true">https://realfin.dev/blog/docker-stop-before-reboot-mistake/</guid><description>restart: unless-stopped treats an explicit docker stop as &apos;the user wants this off&apos;. A reboot script that stopped containers first stranded every service, including DNS.</description><pubDate>Thu, 15 Oct 2026 11:00:00 GMT</pubDate><category>homelab</category><category>docker</category><category>restart-policy</category><category>reboot</category><category>mistakes</category><author>RealFin</author></item><item><title>After every internet outage, some sites broke for 15 minutes. Blame Unbound&apos;s infra cache</title><link>https://realfin.dev/blog/unbound-servfail-after-internet-outage/</link><guid isPermaLink="true">https://realfin.dev/blog/unbound-servfail-after-internet-outage/</guid><description>Unbound marks unreachable nameservers as down for 900 seconds by default and serves instant SERVFAILs. CDN-heavy sites suffer most. Three settings fixed it.</description><pubDate>Thu, 15 Oct 2026 10:40:00 GMT</pubDate><category>homelab</category><category>dns</category><category>unbound</category><category>adguard</category><category>troubleshooting</category><author>RealFin</author></item><item><title>My 10-minute homelab health check (and what it caught)</title><link>https://realfin.dev/blog/homelab-health-check-checklist/</link><guid isPermaLink="true">https://realfin.dev/blog/homelab-health-check-checklist/</guid><description>The commands I run to check a Docker homelab: restart counts, failed units, alarms, disks, backups and log noise. On its first run it found a container that had restarted 22,000 times.</description><pubDate>Thu, 15 Oct 2026 10:30:00 GMT</pubDate><category>homelab</category><category>docker</category><category>monitoring</category><category>checklist</category><category>maintenance</category><author>RealFin</author></item><item><title>Ad blocking for the whole house with AdGuard Home + Unbound in Docker</title><link>https://realfin.dev/blog/adguard-unbound-network-adblock/</link><guid isPermaLink="true">https://realfin.dev/blog/adguard-unbound-network-adblock/</guid><description>Network-wide ad and tracker blocking plus your own recursive DNS resolver, with no Google or Cloudflare DNS. Compose file, router setup and the gotchas.</description><pubDate>Thu, 15 Oct 2026 10:20:00 GMT</pubDate><category>homelab</category><category>dns</category><category>adguard</category><category>unbound</category><category>docker</category><category>privacy</category><author>RealFin</author></item><item><title>How my Jellyfin + *arr media stack fits together (Docker Compose)</title><link>https://realfin.dev/blog/jellyfin-arr-stack-docker/</link><guid isPermaLink="true">https://realfin.dev/blog/jellyfin-arr-stack-docker/</guid><description>Jellyseerr → Sonarr/Radarr → Prowlarr → qBittorrent → Jellyfin. How the pieces talk to each other, hardlinks, FlareSolverr and the settings that tripped me up.</description><pubDate>Thu, 15 Oct 2026 10:00:00 GMT</pubDate><category>homelab</category><category>jellyfin</category><category>sonarr</category><category>radarr</category><category>prowlarr</category><category>docker</category><category>media</category><author>RealFin</author></item><item><title>Backing up a Docker homelab with one script (and no sudo)</title><link>https://realfin.dev/blog/homelab-backup-script-docker/</link><guid isPermaLink="true">https://realfin.dev/blog/homelab-backup-script-docker/</guid><description>A nightly cron job that tars every app&apos;s config with a throwaway Alpine container, keeps 7 copies and skips caches. Plus what it doesn&apos;t protect you from.</description><pubDate>Thu, 15 Oct 2026 09:40:00 GMT</pubDate><category>homelab</category><category>backup</category><category>docker</category><category>cron</category><category>bash</category><author>RealFin</author></item><item><title>Running a private ChatGPT on a 4 GB GPU: Ollama + Open WebUI + SearXNG</title><link>https://realfin.dev/blog/local-ai-ollama-4gb-gpu/</link><guid isPermaLink="true">https://realfin.dev/blog/local-ai-ollama-4gb-gpu/</guid><description>What actually fits on a GTX 1050 Ti, why I baked the context length into the model, and how to give a local LLM web search with self-hosted SearXNG.</description><pubDate>Thu, 15 Oct 2026 09:20:00 GMT</pubDate><category>homelab</category><category>ai</category><category>ollama</category><category>open-webui</category><category>searxng</category><category>gpu</category><category>llm</category><author>RealFin</author></item><item><title>My homelab has zero open ports. Here&apos;s how I still use it from anywhere</title><link>https://realfin.dev/blog/homelab-security-no-port-forwards/</link><guid isPermaLink="true">https://realfin.dev/blog/homelab-security-no-port-forwards/</guid><description>Why I don&apos;t port-forward anything, how Tailscale replaces it, how to publish a website safely with Cloudflare Tunnel, and the hardening checklist I actually follow.</description><pubDate>Thu, 15 Oct 2026 09:00:00 GMT</pubDate><category>homelab</category><category>security</category><category>tailscale</category><category>cloudflare</category><category>docker</category><category>ufw</category><author>RealFin</author></item><item><title>Clean music tags from YouTube downloads with yt-dlp (for Navidrome)</title><link>https://realfin.dev/blog/yt-dlp-music-metadata-navidrome/</link><guid isPermaLink="true">https://realfin.dev/blog/yt-dlp-music-metadata-navidrome/</guid><description>How I turned &apos;ARTIST - TITLE (OFFICIAL VIDEO) 1998.&apos; into proper artist, title and album tags with yt-dlp&apos;s --parse-metadata and --replace-in-metadata.</description><pubDate>Thu, 15 Oct 2026 08:40:00 GMT</pubDate><category>homelab</category><category>music</category><category>navidrome</category><category>yt-dlp</category><category>metadata</category><author>RealFin</author></item><item><title>Hosting a Valheim dedicated server with Docker (the setup I use)</title><link>https://realfin.dev/blog/valheim-dedicated-server-docker/</link><guid isPermaLink="true">https://realfin.dev/blog/valheim-dedicated-server-docker/</guid><description>A complete docker-compose for a Valheim server: ports, auto-updates only when nobody&apos;s online, hourly world backups, and how friends connect.</description><pubDate>Thu, 15 Oct 2026 08:20:00 GMT</pubDate><category>game-servers</category><category>valheim</category><category>docker</category><category>game-server</category><author>RealFin</author></item><item><title>Moving a Valheim world to a dedicated server (the new folder save format)</title><link>https://realfin.dev/blog/valheim-import-world-new-save-format/</link><guid isPermaLink="true">https://realfin.dev/blog/valheim-import-world-new-save-format/</guid><description>Valheim no longer saves worlds as .db + .fwl. Where the new world folder lives, how to get it out of Steam Cloud, and how to load it on a server.</description><pubDate>Thu, 15 Oct 2026 08:00:00 GMT</pubDate><category>game-servers</category><category>valheim</category><category>saves</category><category>steam-cloud</category><category>migration</category><author>RealFin</author></item><item><title>Fixing Valheim server lag with Better Networking (server-side only)</title><link>https://realfin.dev/blog/valheim-server-lag-better-networking/</link><guid isPermaLink="true">https://realfin.dev/blog/valheim-server-lag-better-networking/</guid><description>Valheim caps how much data it sends per player. On a big base that&apos;s the real bottleneck, not your internet. How Better Networking raises the cap, and why vanilla friends can still join.</description><pubDate>Thu, 15 Oct 2026 07:40:00 GMT</pubDate><category>game-servers</category><category>valheim</category><category>lag</category><category>bepinex</category><category>mods</category><category>networking</category><author>RealFin</author></item><item><title>Valheim server without a password: use a Steam ID whitelist instead</title><link>https://realfin.dev/blog/valheim-whitelist-instead-of-password/</link><guid isPermaLink="true">https://realfin.dev/blog/valheim-whitelist-instead-of-password/</guid><description>Valheim never remembers server passwords. permittedlist.txt lets only your friends&apos; Steam IDs in, with no password prompt, and it&apos;s arguably more secure.</description><pubDate>Thu, 15 Oct 2026 07:20:00 GMT</pubDate><category>game-servers</category><category>valheim</category><category>security</category><category>whitelist</category><category>dedicated-server</category><author>RealFin</author></item><item><title>Valheim mods on a dedicated server: which ones need the server, and which are client-only</title><link>https://realfin.dev/blog/valheim-mods-client-vs-server/</link><guid isPermaLink="true">https://realfin.dev/blog/valheim-mods-client-vs-server/</guid><description>Some mods only change your own game, others need every player and the server on the same version. How to tell the difference so vanilla friends can still join.</description><pubDate>Thu, 15 Oct 2026 07:00:00 GMT</pubDate><category>game-servers</category><category>valheim</category><category>mods</category><category>bepinex</category><category>r2modman</category><category>thunderstore</category><author>RealFin</author></item><item><title>Running a big Minecraft modpack (ATM10) in Crafty Controller with Docker</title><link>https://realfin.dev/blog/crafty-controller-modpack-import/</link><guid isPermaLink="true">https://realfin.dev/blog/crafty-controller-modpack-import/</guid><description>Crafty can&apos;t import a server from a folder, only from an uploaded zip. The placeholder-and-swap workaround, the Java 21 command for NeoForge and where the memory setting really lives.</description><pubDate>Thu, 15 Oct 2026 06:40:00 GMT</pubDate><category>game-servers</category><category>minecraft</category><category>crafty</category><category>modpacks</category><category>neoforge</category><category>docker</category><author>RealFin</author></item><item><title>Roblox RemoteEvents: never trust the client (a checklist for AI-written code)</title><link>https://realfin.dev/blog/roblox-remote-events-never-trust-the-client/</link><guid isPermaLink="true">https://realfin.dev/blog/roblox-remote-events-never-trust-the-client/</guid><description>Exploiters can fire any RemoteEvent with any arguments. The validation every remote needs, and the mistakes AI coding assistants make by default.</description><pubDate>Thu, 15 Oct 2026 06:20:00 GMT</pubDate><category>roblox</category><category>roblox</category><category>luau</category><category>security</category><category>remote-events</category><category>ai-coding</category><author>RealFin</author></item><item><title>Roblox DataStores without data loss: retries, UpdateAsync and BindToClose</title><link>https://realfin.dev/blog/roblox-datastore-safe-saving/</link><guid isPermaLink="true">https://realfin.dev/blog/roblox-datastore-safe-saving/</guid><description>Player data loss is the bug that kills Roblox games. The patterns that prevent it: UpdateAsync over SetAsync, retry with backoff, saving on shutdown and session locking.</description><pubDate>Thu, 15 Oct 2026 06:00:00 GMT</pubDate><category>roblox</category><category>roblox</category><category>luau</category><category>datastore</category><category>saving</category><author>RealFin</author></item></channel></rss>