My Homelab Setup

Overview

In Summer 2025, I started getting into homelabbing. I started small with an unused laptop, and then wanted to build a full server. It currently helps me share some of my media (e.g., recordings of my games with friends) and AI services (OpenWebUI, ComfyUI) with friends, keeps an up-to-date replica of my Obsidian vault, and hosts many services for household chores (groceries, inventory, finances). The purpose of this blog post is to show my current setup, and share some of the lessons I learned during this journey.

Note: All of my Docker compose files can be found here.

Components

Hardware

Below is a table of the components of my server, all of them bought from Amazon.

Component Reference
CPU (Processor) AMD Ryzen 9 7900X
GPU (Graphics Card) ASUS TUF Gaming NVIDIA GeForce RTX 3090 OC Edition
Motherboard GIGABYTE B650 AORUS Elite AX
RAM (Memory) 2x Crucial Pro 64GB DDR5 5600MHz (2x32GB)
Storage (SSD) SAMSUNG 990 PRO SSD 2TB
Storage (HDD) 3x Seagate IronWolf 8TB 7200 RPM
Power Supply (PSU) be quiet! Pure Power 13 M 1000W 80+ Gold
CPU Cooler Thermalright Phantom Spirit 120 EVO
Case Fractal Design Define R5

Note: I originally started with a budget NVIDIA 5060 Ti to make sure everything worked before committing to the 3090.

Software

Here is a list of the main software that I use:

Homepage of my setup
Example Grafana Dashboard

Services

Obsidian

As written in an earlier blog post, I use Obsidian a lot. I used to subscribe to Obsidian Sync to synchronize my notes across devices, but once I started building my server, I wanted something self-hosted. So now I use the “Self-hosted LiveSync” plugin and I have a copy of my vault always synchronized on my server. It uses two containers, one for the underlying database, and one for hosting a WebUI of Obsidian (Docker compose here). Beyond the redundancy, it allows me to use the MCP endpoint of my vault whenever I want (since it’s always online on the tailnet).

Household

I use several isolated services for household-related stuff (each in their own LXC):

Screenshot of Mealie
Screenshot of HomeBox

AI Stack

The last part of my stack is the AI-related services. I divided it into three sections: backend services, frontend services powered by the backend services, and the AI agent.

Backend: Ollama (LLM), Whisper (STT), Chatterbox (TTS)

AI nowadays can write, listen, and speak (among other capabilities). While I could simply pay for good proprietary models (honestly, it might be cheaper at this scale), the ecosystem contains many great open-source solutions. To power my AI services, I use those three frameworks:

The AI models are all on my SSD (for faster load/unload), with the directory mounted directly into the container. I tinkered with Whisper and Chatterbox to set up a proxy to avoid having the models always on GPU, otherwise I wouldn’t be able to load LLMs. Because they come with custom files and cannot be contained in a compose file, only my Ollama compose is available here.

Frontend: Open WebUI, ComfyUI

Beyond the backend, I host three AI services that are user-facing (Compose here):

Honestly, I don’t use them so much, but it was good to tinker with and it can be handy sometimes.

Hermes Agent

With all the hype around OpenClaw, I got interested in Claw-style projects. I tried many for a bit (OpenClaw, NanoBot, IronClaw, ZeroClaw…) but ended up settling for Hermes Agent. I have a dedicated VM running it.

I currently run three profiles (or agents), all connected to Discord as separate bots:

The agents all use my Whisper and Chatterbox services. For the underlying LLM, I mainly use OpenRouter, specifically Deepseek v4 Flash because it’s good and cheap (I spend less than 20$/month on OpenRouter credits). I found that the Ollama models with a 3090 weren’t quite that good and fast. My current rationale is that I pay for better models right now so that they can figure out edge cases and build the skills, scripts, and references. Then, a less capable local model can use them consistently.

I use the docker backend (i.e., any tool call is within a Docker container) and I add the Tailscale DNS to it (with the --dns flag). This is fairly overkill since it’s in a VM, but it’s good practice to sandbox the agents.

Fun Fact: The names are taken from one of my favorite games, Detroit: Become Human (Kara and Connor), and an anime that I like, Dr Stone (Senku).

Screenshot of the Hermes Agent Dashboard

Media

After setting up my server, I started recording and uploading my game sessions to it. I use Jellyfin (and Jellystat for some statistics, full compose here). For example, I recorded all of our game sessions playing Abiotic Factor (see screenshot below). I also vibe-coded a simple “highlight” container that takes the recordings and generates highlights by looking at the transcript using Whisper and Ollama.

Screenshot of Jellyfin

Things I Learned

Conclusion

My homelab journey took some time and effort to get to a point where it runs smoothly, but it definitely paid off. I think that I learned a lot by going through the process. As my primary research area is security, thinking (or rather, being paranoid) about the security of my setup helped me a lot to solidify my knowledge. I’d advise people who want to do research in a given area to just immerse themselves in the tech and tinker with it.

Credits

This whole setup is built upon free and/or open-source software. I thank all the maintainers and contributors to these projects, it’s great stuff!