Homelab & Self-Hosted Infrastructure
The systems side of this site isn't a diagram on a slide — it's a running homelab I own end to end. Source control, files, media, chat and social all run on my own hardware, in Docker Compose, exposed to the internet the hard way. On top of it sits something less common: a self-hosted, local-model AI platform that drives an agent over my own LLM, image, video, speech and 3D models — no third-party API in the loop. This is the same architecture-through-deployment ownership I bring to client work, applied to my own stack.
The edge: a reverse WireGuard tunnel
The home lab never exposes its own IP. Instead, a small rented node acts as an edge ingress: it holds the public IP and the DNS records, and forwards traffic to the lab over a WireGuard tunnel that the lab dials outbound. Nothing at home listens on a public address, so the residential IP never leaks — and if the edge ever takes abuse, it's a disposable lever I can null-route or rebuild without touching a single service.
What's running
Thirty-odd containers, each defined in its own Docker Compose project, behind a reverse proxy that terminates TLS and routes each subdomain. A few of these back the links elsewhere on this site; most are just how I choose to own my own data. The AI platform gets its own section below.
Federated & social
GitLab
Self-hosted Git with CI/CD runners, container registry and issue tracking. Where my own projects and infrastructure-as-code live.
git.computingcache.com FediverseMastodon
A personal Mastodon instance (“ComputingCache”) on the ActivityPub fediverse — my own corner of decentralised social.
mastodon.computingcache.com MessagingMatrix · Synapse
A Synapse homeserver federating on Matrix, delegated from the apex domain. This is the @luke:computingcache.com you can message me at.
Nostr relay
My own Nostr relay on the network — accepting and rebroadcasting signed events, so I'm not renting a seat on someone else's relay.
Files & personal
Nextcloud
Files, calendar and contacts — my own Google-Drive replacement, synced across devices and shared on my terms.
PhotoPrism
A self-hosted photo library with on-device tagging and search — Google Photos without handing Google the photos.
Trilium
A hierarchical notes and knowledge base — my second brain, versioned and mine, not a subscription.
Monica
A personal CRM: who I know, how we're connected, what we last talked about — relationships kept off other people's servers.
Grocy
Groceries, stock and household chore tracking — the “ERP for your fridge”, self-hosted.
Media libraries
Jellyfin
A media server for my own film and TV library, streamed to any device without a subscription or a third party in the middle.
Calibre
An e-book library and reader server — my whole collection, organised and readable from anywhere.
GameVault · Retrom
Self-hosted game libraries — a “Steam for DRM-free games” backend plus a retro/emulation collection, streamed to my own clients.
LANraragi
A tagged, searchable archive server for a large comic/manga collection.
Knowledge & archival
ArchiveBox
A self-hosted web archive — anything I bookmark is snapshotted to HTML, screenshot and WARC, so link-rot can't touch it.
HTTrack
On-demand full-site mirroring — pull an entire site down for offline reading or preservation.
Kiwix
Offline Wikipedia and other ZIM knowledge bases — the reference internet, served from my own disk even if the real one is gone.
LanguageTool
A private grammar and style server for my own writing — spell-check that doesn't ship my prose to a cloud vendor.
Operations, privacy & the boring bits
Prometheus + Grafana
Metrics scraping and dashboards for every host and container — the panes of glass I actually watch.
Matomo
Privacy-first, self-hosted web analytics — I get the numbers without feeding a third party a tracker.
I2P
A node on the I2P anonymising network — self-hosting on the darknet as well as the clearnet.
XBackBone
A self-hosted screenshot and file host with a ShareX endpoint — my own image-sharing short-links.
Ops & access
Automated offsite backups, WireGuard for remote access, and network-wide ad-blocking DNS — the parts that keep the rest healthy.
The AI platform: “Task Studio”
This is the part I'm proudest of. On top of the homelab runs a self-hosted, agentic AI platform — a password-gated console I call Task Studio that turns a plain-English request into a finished deliverable: a researched report, a small website, generated images, or a fully narrated, scored and captioned marketing video. Every model runs on my own hardware. There is no OpenAI, no Anthropic, no third-party API anywhere in the loop — the LLM that reasons, the diffusion models that render, the voice that narrates, and the model that turns an image into a 3D mesh are all local.
It started as something smaller: a worker for an online task marketplace (built with the platform operator's permission) that polls open bounties, uses a local model to judge which are genuinely AI-suitable, drafts a proof, routes it through a human-review queue, submits it, and sweeps any earnings to a cold wallet. That pipeline — classify → draft → review → dispatch — became the spine everything else hangs off.
Three hosts, one agent
The work is split across three machines so a weak orchestration box never blocks the GPU, and the GPU box never has to hold state. A bot host takes the request and dispatches the agent; the agent host runs the agent runtime and the media tooling; and a GPU rig serves the actual models. The bot reaches the agent over a locked-down reverse-SSH tunnel, and the agent drives the GPU host over HTTP and SSH.
The Docker box in the diagram at the top of this page. Runs the task poller, the dispatcher, the Task Studio web UI, and the Eva chat hub. Holds no GPU and no models — just state and routing.
Runs the agent runtime in a fresh workspace per job, plus the whole media toolbox as CLIs. Reachable only through a bearer-token HTTP endpoint bound to the far end of a reverse-SSH tunnel.
A dual-GPU rig serving a local LLM via llama-server, ComfyUI for diffusion (a second worker on the other GPU for parallel video), and TTS-WebUI for voices. Services free and reload each other's VRAM on demand.
A local media pipeline the agent drives
The agent doesn't just write text — it can call a full production toolbox, review its own output (a vision model describes each render so the agent can judge it), and composite the pieces together. All of it local, much of it able to fan out across both GPUs:
Eva — one assistant, every platform
The same brain is reachable as Eva, a chat assistant that lives on Discord, Matrix and Nostr at once through a microservice hub: platform-specific bots forward commands to a central service (with accounts, permissions and bans) that answers from the local model and can queue Task Studio jobs, pinging you back when the work finishes. It even does cross-platform crypto tips — send someone coins on Matrix from Discord via a derived, redeemable code.
Rebuildable on purpose
All three hosts are captured as Ansible. If hardware dies, the reproducible parts — the bot stack, the agent runtime, every media CLI, the model manifest — come back with a command, and the hand-built GPU rig has an honest runbook rather than a fantasy one-click. Model swaps are a deliberate, documented playbook, not a scramble. It's a research toy in scope and a production system in discipline.
The stack
Boring on purpose — everything here is standard, reproducible, and something I'd be comfortable handing to a client.
Mail is the one thing I don't run here — it's handled by a managed provider, because deliverability is a full-time job I'd rather outsource. Everything else, from the metal to the reverse proxy, is mine. Curious about the setup, or want something like it built? Get in touch.