HOME LAB / ENGINEERING NOTES

Inside my home lab

From the router to a local AI agent: the hardware, services, integrations and boundaries behind my home setup.

Implementation snapshot: 11 September 2026. Examples use illustrative values.

Three layers, one environment

I split my home infrastructure by workload. The router provides connectivity, the NAS keeps everyday services running, and the PC supplies compute for AI. This website is itself hosted on the NAS.

LayerHardwareRole
NetworkMikroTik hEX S · RouterOS 7Routing, NAT, DNS, DHCP, WireGuard
ServicesSynology DS220+ · approx. 6 GB RAMDSM, Container Manager, storage, monitoring, HTTPS
ComputeWindows PC · 64 GB RAM · RTX 5070 Ti 16 GBDocker Desktop / WSL, Ollama, agent, ComfyUI

This is a logical overview. Public examples omit private addresses, key material and device credentials.

Network, remote access and HTTPS

I upgraded RouterOS from version 6 to 7 after creating configuration backups and exports. I updated RouterBOARD firmware too, checked connectivity and DNS, then replaced the unused PPTP service with WireGuard.

  • WireGuard provides access to private home services from my phone. Full-tunnel operation routes the phone’s Internet traffic through home as well.
  • Separate input and forward firewall rules handle VPN handshakes, DNS, access to the LAN and Internet routing.
  • MikroTik IP Cloud provides DDNS. OVH hosts my public DNS zone; mail records are independent of web hosting.
  • Public HTTP/HTTPS traffic reaches Caddy on the NAS through NAT. Caddy serves static pages and proxies the music service; the chat and administration interfaces remain private.

For local names, I account for split DNS and hairpin NAT. Resolving a hostname and receiving a ping reply only confirms part of the path: the destination port must still provide the correct HTTP or TLS service.

Services on the NAS

ServicePurposeConfiguration
HomepageEntry point for services, status and measurement history.YAML configuration, links and Uptime Kuma / MySpeed widgets; private access.
Uptime KumaAvailability history for the Internet and selected devices, including cameras and printers.Ping/HTTP checks and persistent container data; the basic Internet ping runs every 60 seconds.
MySpeedConnection throughput measurements and their history.Separate container with persistent data, also surfaced in Homepage.
VaultwardenMy own password vault for Bitwarden-compatible clients.HTTPS, persistent NAS storage, access over the home network or WireGuard.
NavidromeMy own music library, also accessible from a phone.Dedicated music share mounted read-only; database in /data, a scan every 15 minutes and public HTTPS through Caddy.
CaddyPublic websites and a reverse proxy for music streaming.Automatic TLS certificates, persistent certificate storage and read-only website mounts.
Synology Photos / Drive / Surveillance StationDSM packages for photos, files and camera monitoring.NAS services independent of the containers. Public access is not enabled for every service.
Small Bielik modelAn experimental lightweight Polish model on the NAS CPU.llama.cpp in a container; retained for experiments, while the main agent uses the PC GPU.

I keep service data in persistent directories, separate from container lifetimes. Compose defines restart policies and resource limits. On this NAS, a CPU quota caused a CFS compatibility error, so I retained memory limits without that quota.

Monitoring is evidence for diagnosis, not a certified ISP measurement. Throughput also depends on concurrent traffic, the NAS and the selected test server. Battery-powered or sleeping devices need checks appropriate to their normal behaviour.

Docker and AI on the PC

My main chat runs on the PC. Open WebUI connects to Ollama through host.docker.internal; Ollama runs on Windows and uses the GPU. A Docker network connects the WebUI with search, the Google bridge, SSH Operator and ComfyUI.

ComponentDeploymentConnection
Open WebUIDockerOllama + agent tools
Ollama / Qwen3 14BWindowsGPU inference
SearXNGDockerInternal Docker network
Google bridgeDocker / PythonOAuth + Gmail API + Calendar API
PC ObserverWindows / PowerShellSelected read-only API endpoints
SSH OperatorDocker / PythonSSH keys + audit
ComfyUIDocker / CUDAWorkflow API + persistent output

A Windows logon script starts Docker Desktop, Ollama and the observer, waits for Docker to become ready and starts the Compose services. This is logon startup, not guaranteed unattended startup before a user signs in. Starting the services does not preload a large model into VRAM.

What the agent can do

The model selects a function and its arguments. Python tools execute the request, return structured results and let the model write a human-readable response. I explicitly assign those tools to the model and enable native function calling in Open WebUI.

CapabilityExample requestWhat happens
Web search“Find recent 3D printing news.”A tool queries SearXNG and returns results for the model to summarise. Search contacts Internet services and is not an offline operation.
PC diagnostics“List the installed applications.”PC Observer exposes selected Windows data through an API: registry-based application inventory, services, network and system details. It does not give the model a general Windows shell.
Files and scripts“Read this configuration and draft a script.”I place selected files in a read-only Context mount. Drafts go to a separate writable review directory; this tool does not execute them.
SSH“Check the device status.”A separate SSH Operator uses keys to connect to configured devices and records an audit. It can perform real administrative operations; permissions come from the device account.
Gmail“Summarise my latest messages.”A local Google bridge uses OAuth and the Gmail API. It returns limited previews and the retrieved count; a preview is not the full message.
Email replies“Draft a reply and show it to me.”The tool first creates a draft. My agent instructions require approval of that specific draft before invoking the sending operation.
Calendar and ICS“Read the event attachment and suggest an entry.”The bridge parses event data from ICS and the agent presents a proposal. Creation follows my instruction; the email receipt date is not the meeting date.
Image generation“Create an illustration for a story.”The tool prepares the description, unloads the chat model, submits a ComfyUI workflow, waits for completion and returns an image link. It requests model unloading afterwards.

A successful API call and a correct answer are different things. I check source dates, retrieved counts and generated results. Approval instructions guide the agent’s behaviour; they are not a substitute for server-side authorisation.

Sharing the GPU

My PC is also used for gaming, so retaining every model in VRAM is not useful. Ollama is configured for one loaded model and five minutes of keep-alive. Before image generation, the image tool requests that running language models unload. It submits a workflow to ComfyUI, then requests memory release after the result is saved.

Question → Ollama → tool call
Image request → unload LLM → ComfyUI → save result → unload image model
Next question → load LLM again

This is sequential resource management, not a guarantee that all 16 GB will be available. Windows, the display and other GPU applications use memory too. Host RAM and the RAM assigned to WSL are separate limits; filesystem caching may accelerate reloads but does not guarantee a permanently resident model.

Privacy and practical boundaries

  • Local model inference; web search and Google integrations still communicate with external services.
  • Selected PC data is read-only. Draft files have a separate write directory. SSH permissions are distinct and may allow real configuration changes.
  • Secrets stay outside public website files. Certificates and application data need their own protected backup.
  • I treat webpages and emails as untrusted input. The model may still misinterpret content, omit details or produce an incorrect answer.

The lab is an evolving personal project. Voice, a family document knowledge base, automatic PC wake-up and broader media generation are planned extensions, not claims about finished features.