Blog
31 posts about homelab, game servers and Roblox development.
- Homelab
How this blog is built: Astro + Cloudflare Pages for the price of a domain
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.
- Homelab
Applying for Google AdSense with a brand-new static site: what actually happened
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.
- Homelab
A Cloudflare API token that can't hurt you (least privilege, IP lock, expiry)
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.
- Homelab
Free email on your own domain with Cloudflare Email Routing (receive-only)
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.
- Homelab
New DNS record works everywhere except at home? Negative caching
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 'doesn't exist' answer. The one Unbound setting that fixes it.
- Homelab
My network ad blocker broke my own AdSense dashboard
Every button in Google AdSense did nothing. The cause was my AdGuard Home blocking Google's ad domains house-wide. How to confirm it, and how to unblock AdSense for just one PC.
- Homelab
Prowlarr sync keeps failing with HTTP 400? Find the indexer Sonarr and Radarr reject
Prowlarr logged '400 BadRequest' 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.
- Homelab
Zigbee2MQTT restarted 22,112 times, and Docker never told me
A container that lost its Docker network after a reboot, couldn't resolve the MQTT broker, and crash-looped for three days. How to spot it and fix it.
- Homelab
Certbot renewal failing every 12 hours: 'bind() to 0.0.0.0:80 failed'
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.
- Homelab
My homelab tour: one server, ~30 Docker containers
What runs on my home server, how it's organised with Docker Compose, and the lessons that shaped it.
- Homelab
Docker logs ate 2.4 GB on my server. Here's how to cap them
Docker's json-file logs grow forever by default. Two lines in daemon.json fix it, but only for containers created afterwards.
- Game servers
Why Valheim crops don't grow on a dedicated server when nobody's online
I measured the world clock in the server's save files: it stops about 13 minutes after the last player leaves. Crops, smelters and kilns only progress while someone is connected.
- Homelab
Docker said 32 GB was reclaimable. The real number was closer to 3
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's actually unused before you prune anything.
- Homelab
Jellyfin 'fatal player error' after an NVIDIA update: the driver/library mismatch
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.
- Homelab
Why 'docker stop' before a reboot left my whole homelab down for two days
restart: unless-stopped treats an explicit docker stop as 'the user wants this off'. A reboot script that stopped containers first stranded every service, including DNS.
- Homelab
After every internet outage, some sites broke for 15 minutes. Blame Unbound's infra cache
Unbound marks unreachable nameservers as down for 900 seconds by default and serves instant SERVFAILs. CDN-heavy sites suffer most. Three settings fixed it.
- Homelab
My 10-minute homelab health check (and what it caught)
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.
- Homelab
Ad blocking for the whole house with AdGuard Home + Unbound in Docker
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.
- Homelab
How my Jellyfin + *arr media stack fits together (Docker Compose)
Jellyseerr → Sonarr/Radarr → Prowlarr → qBittorrent → Jellyfin. How the pieces talk to each other, hardlinks, FlareSolverr and the settings that tripped me up.
- Homelab
Backing up a Docker homelab with one script (and no sudo)
A nightly cron job that tars every app's config with a throwaway Alpine container, keeps 7 copies and skips caches. Plus what it doesn't protect you from.
- Homelab
Running a private ChatGPT on a 4 GB GPU: Ollama + Open WebUI + SearXNG
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.
- Homelab
My homelab has zero open ports. Here's how I still use it from anywhere
Why I don't port-forward anything, how Tailscale replaces it, how to publish a website safely with Cloudflare Tunnel, and the hardening checklist I actually follow.
- Homelab
Clean music tags from YouTube downloads with yt-dlp (for Navidrome)
How I turned 'ARTIST - TITLE (OFFICIAL VIDEO) 1998.' into proper artist, title and album tags with yt-dlp's --parse-metadata and --replace-in-metadata.
- Game servers
Hosting a Valheim dedicated server with Docker (the setup I use)
A complete docker-compose for a Valheim server: ports, auto-updates only when nobody's online, hourly world backups, and how friends connect.
- Game servers
Moving a Valheim world to a dedicated server (the new folder save format)
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.
- Game servers
Fixing Valheim server lag with Better Networking (server-side only)
Valheim caps how much data it sends per player. On a big base that's the real bottleneck, not your internet. How Better Networking raises the cap, and why vanilla friends can still join.
- Game servers
Valheim server without a password: use a Steam ID whitelist instead
Valheim never remembers server passwords. permittedlist.txt lets only your friends' Steam IDs in, with no password prompt, and it's arguably more secure.
- Game servers
Valheim mods on a dedicated server: which ones need the server, and which are client-only
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.
- Game servers
Running a big Minecraft modpack (ATM10) in Crafty Controller with Docker
Crafty can'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.
- Roblox dev
Roblox RemoteEvents: never trust the client (a checklist for AI-written code)
Exploiters can fire any RemoteEvent with any arguments. The validation every remote needs, and the mistakes AI coding assistants make by default.
- Roblox dev
Roblox DataStores without data loss: retries, UpdateAsync and BindToClose
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.