The Phase Space: A Complete Homelab Tech Stack Inventory
As of February 2026. This is a raw inventory draft for phasespace.co — edit for public consumption.
TL;DR
Three-node Proxmox cluster, two NVIDIA Blackwell GPUs (RTX 5090 + RTX 5060), 156GB total RAM, 28TB NAS, 40+ LXC containers and VMs, four specialized AI agents running on-premises 24/7. This is what it actually takes to run AI infrastructure at home.
Proxmox Cluster Overview
Cluster name: grue-cluster
PVE version: 9.1.2, kernel 6.17.4-1-pve
Nodes: 3 (all online, uptime ~4.8 days at time of writing)
pve-dev — 10.2.1.10
| Spec | Value |
|---|---|
| Form factor | Minisforum MS-A2 |
| CPU | AMD Ryzen 9 7945HX (16C/32T, 2.5–5.4 GHz) |
| RAM | 64 GB DDR5 |
| GPU | NVIDIA GeForce RTX 5090 (GB202, 32GB VRAM) |
| Boot storage | NVMe (system) |
| VM storage | 100GB NVMe thin-provisioned |
| Role | Primary AI compute — Ollama inference, OpenClaw multi-agent, MCP servers, code environment |
| RAM used | ~43 GB / 64 GB |
Services on pve-dev: Ollama GPU (VM 690), MCP Quantum Context (VM 680), Clawdbot/Phase Space (VM 620), Home Assistant (VM 300), Gitea (LXC 600), Open WebUI (LXC 611), code-quantum VSCode (LXC 630), data-quantum SQL (LXC 640), v8 MCP Server (LXC 670)
pve-utility — 10.2.1.15
| Spec | Value |
|---|---|
| Form factor | Minisforum NAB9 |
| CPU | Intel Core i9-12900H (14C/20T, 2.5–5.0 GHz) |
| RAM | 64 GB DDR5 |
| GPU | NVIDIA GeForce RTX 5060 (GB206, 8GB VRAM) |
| Boot storage | NVMe (64GB system) |
| VM storage | 921 GB NVMe thin-provisioned (128 GB used, 14%) |
| NAS mounts | 8× NFS mounts from Synology NAS (28TB pool, 25% used) |
| Role | Infrastructure hub — reverse proxy, DNS, monitoring, productivity, AI transcription |
| RAM used | ~22 GB / 64 GB |
Services on pve-utility: Transcriptor/Ollama-utility GPU (VM 610), Caddy reverse proxy (LXC 115), Cloudflare tunnel (LXC 120), Tailscale VPN router (LXC 125), Ansible control node (LXC 130), Technitium DNS secondary (LXC 151), Prometheus (LXC 400), InfluxDB (LXC 401), Grafana (LXC 405), Uptime Kuma (LXC 406), Beszel Hub (LXC 407), ntfy (LXC 408), UniFi Poller (LXC 410), Homer Dashboard (LXC 420), CopyParty file server (LXC 530), CouchDB/Obsidian LiveSync (LXC 535), Nextcloud (LXC 540), n8n (LXC 660), Karakeep (LXC 520)
pve-media — 10.2.1.20
| Spec | Value |
|---|---|
| Form factor | Beelink EQ14 |
| CPU | Intel Core i3-1220P (10C/12T) |
| RAM | 32 GB DDR4 |
| GPU | None |
| Boot storage | SSD (34 GB system) |
| PBS storage | 458 GB NVMe dedicated backup datastore |
| NAS mounts | 3× NFS mounts |
| Role | Media stack + Proxmox Backup Server |
| RAM used | ~5.4 GB / 32 GB |
Services on pve-media: Technitium DNS primary (LXC 150), MeTube YouTube downloader (LXC 220), Sonarr (LXC 221), Radarr (LXC 222), Jellyfin (LXC 223), Prowlarr (LXC 224), qBittorrent+VPN (LXC 225), Lidarr (LXC 226), FileBot (LXC 227), Music-Tools (LXC 228), Jellyseerr (LXC 229), Readarr (LXC 230)
Network Topology
Physical Network
- Switch: UniFi USW Aggregation
- Router/Firewall: UniFi Dream Machine SE (UDM SE)
- APs: UniFi U7 Pro (Wi-Fi 7)
- 10GbE: Dedicated VLAN 60 (StorageVLAN10gb, 10.10.20.0/24) connecting pve-utility ↔ Synology NAS at 10 Gbps for NFS/backup traffic
- Monitoring: UniFi Poller → Prometheus → Grafana (LXC 410/400/405)
VLANs
| VLAN | Name | Subnet | Purpose |
|---|---|---|---|
| 1 | Unifi Infrastructure | 10.2.0.0/24 | UniFi network hardware only |
| 10 | Management Services | 10.2.10.0/24 | LXC/VM management plane |
| 21 | Trusted | 10.2.1.0/24 | Primary services + hosts |
| 210 | IoT | 10.2.30.0/24 | Home Assistant, Zigbee, smart devices |
| 2 | Surveillance | 10.2.20.0/24 | Security cameras (internet-isolated) |
| 3 | Silo | 10.2.40.0/24 | Airgapped experimentation, malware analysis |
| 60 | StorageVLAN10gb | 10.10.20.0/24 | 10GbE Proxmox ↔ NAS storage fabric |
| 1610 | Guest | 192.168.10.0/24 | Isolated guest WiFi |
IP strategy (VLAN 21): Ranges 1–230 reserved for static allocation (infrastructure, services, media), DHCP pool intentionally tiny (10.2.1.231–254, 24 IPs) — all servers have static IPs.
Tailscale Mesh
Every device with internal access runs a Tailscale client. Key nodes:
- Tailscale subnet router: LXC 125 (10.2.1.125) → advertises 10.2.1.0/24 and 10.2.10.0/24
- Redundant router: Synology NAS (Athena)
- pauls-mbp: 100.111.17.71 (M3 Max 16-core/64GB)
- calarts-mbp: 100.98.171.89 (M3 Max 14-core/36GB)
- Clawdbot VM: 100.108.11.29
Remote access to any 10.2.x.x service works via Tailscale regardless of location, without a VPN app on the device — just the Tailscale subnet route.
DNS
Technitium DNS in active-failover cluster:
- Primary: LXC 150 on pve-media (10.2.1.150)
- Failover: LXC 151 on pve-utility (10.2.1.151)
- Features: ad-blocking, local domain resolution (.lab, .iot), DNS-over-HTTPS, conditional forwarding
External Access Architecture
Exposed services: code.grue.ai, grafana.grue.ai, gitea.grue.ai, ha.grue.ai, nextcloud.grue.ai.
All *.grue.ai subdomains require Google OAuth by default. Adding a new external service takes about 3 minutes (one Caddyfile line + one DNS record).
GPU Compute
RTX 5090 — pve-dev (10.2.1.10)
| Detail | Value |
|---|---|
| GPU | NVIDIA GeForce RTX 5090 (GB202, Blackwell) |
| VRAM | 32 GB |
| CUDA | 13.0 |
| Driver | nvidia-driver-580-open |
| PCIe passthrough | VM 690 (Ollama GPU) |
| Performance | ~417 tok/s (llama3.2:3b), ~242 tok/s (llama3.1:8b) |
Workloads:
- Primary Ollama inference — 29 models on NFS, 140GB total
- MCP Quantum Context — semantic search, embedding generation (nomic-embed-text, 768-dim), RAG
- Fallback embedding target for MCP when RTX 5060 is saturated
Models on RTX 5090 (Ollama, 10.2.1.69):
llama3.3:70b-instruct-q2_K(26 GB) — general reasoning, instruction followingllama3.1:70b-instruct-q4_K_M(42 GB) — high quality 70Bdeepseek-r1:70b(42 GB) — chain-of-thought reasoningdeepseek-r1:14b(9 GB) — fast reasoninggemma2:27b-instruct-q8_0(28 GB) — Google’s 27Bgemma2:27b(15 GB)qwen2.5:32b-instruct(19 GB) — default OpenClaw fallback modelllama3.1:8b,llama3.2:3b,llama3.2:1b,llama3.2-vision:11bmistral-large:latest(73 GB — requires full VRAM, loaded on demand)deepseek-coder:6.7b,codellama:7b,codellama:13b,codegemma:7b-instructnomic-embed-text(274 MB) — embeddings for mem0/Qdrantphi3:mini,phi3:medium,hermes3:latest,marco-o1:7b,mistral:7b, and others
RTX 5060 — pve-utility (10.2.1.15)
| Detail | Value |
|---|---|
| GPU | NVIDIA GeForce RTX 5060 (GB206, Blackwell) |
| VRAM | 8 GB |
| CUDA | 13.0 |
| Driver | nvidia-driver-580-open |
| PCIe passthrough | VM 610 (Transcriptor/Ollama-utility) |
Workloads:
- Whisper transcription — GPU-accelerated video/audio transcription via OpenAI Whisper (Docker). 3AM daily batch processing against NAS media library.
- Ollama-utility — lightweight local inference (llama3.2:3b, nomic-embed-text). Primary embedding source for MCP Quantum Context.
- Ollama HA — MCP uses this as primary (low latency, 10.2.1.61:11434), RTX 5090 as fallback (10.2.1.69:11434)
Services Inventory
Full container/VM list. All on VLAN 21 (10.2.1.0/24) unless noted.
Infrastructure & Management
| ID | Service | IP | Port | Node | Notes |
|---|---|---|---|---|---|
| 115 | Caddy | 10.2.1.115 | 80 | pve-utility | Reverse proxy. Routes all *.grue.ai by Host header. ~30MB RAM. |
| 120 | Cloudflared | 10.2.1.120 | — | pve-utility | Central Cloudflare tunnel for all external services |
| 125 | Tailscale VPN | 10.2.1.125 | — | pve-utility | Subnet router. Alpine Linux, ~17MB RAM. |
| 130 | Ansible | 10.2.1.130 | — | pve-utility | Automation control node. Manages all 3 Proxmox hosts, 30+ LXCs, 6 VMs. Automated OS updates on cron. |
| 150 | Technitium DNS (primary) | 10.2.1.150 | 5380 | pve-media | Ad-blocking DNS + local resolution |
| 151 | Technitium DNS (secondary) | 10.2.1.151 | 5380 | pve-utility | DNS failover |
Monitoring & Observability
| ID | Service | IP | Port | Notes |
|---|---|---|---|---|
| 400 | Prometheus | 10.2.1.40 | 9090 | Primary metrics collection |
| 401 | InfluxDB | 10.2.1.41 | 8086 | Time-series database |
| 405 | Grafana | 10.2.1.98 | 3000 | Dashboards for cluster, network, services |
| 406 | Uptime Kuma | 10.2.1.147 | 3001 | 38 monitors. Alerts via ntfy. |
| 407 | Beszel Hub | 10.2.1.57 | 8090 | Agent-based server metrics (alternative to Prometheus node exporter) |
| 408 | ntfy | 10.2.1.58 | 80 | Push notification server. Self-hosted. All Uptime Kuma alerts route here. |
| 410 | UniFi Poller | 10.2.1.44 | 9130 | Pulls UniFi switch/AP metrics into Prometheus |
| 420 | Homer Dashboard | 10.2.1.45 | 3000 | Unified service landing page |
| 490 | Network Testing | 10.2.1.49 | 5201 | Alpine LXC with iPerf3, speedtest-cli, mtr, nmap, DNS tools |
Productivity & Web Apps
| ID | Service | IP | Port | Notes |
|---|---|---|---|---|
| 520 | Karakeep | 10.2.1.52 | 3000 | AI-powered bookmark manager. v0.30.0. Built from source. Chromium + Meilisearch + yt-dlp (50MB video cap). Assets on NAS. |
| 530 | CopyParty | 10.2.1.153 | 3924 | File server. NAS-backed. Tailscale Serve: https://copyparty.ide-grue.ts.net |
| 535 | CouchDB/Obsidian | 10.2.1.53 | 5984 | Obsidian LiveSync sync server. CouchDB 3.5.1. Database: grue-brain. NFS storage. HTTPS via Tailscale for mobile. |
| 540 | Nextcloud | 10.2.1.54 | 80 | NC 32.0.3. PHP 8.3 + PostgreSQL 17 + Redis. NAS-backed via NFS. 16GB upload limit. External: https://nextcloud.grue.ai |
| 660 | n8n | 10.2.1.66 | 5678 | Workflow automation. Self-hosted. |
Media Stack
Full *arr stack on pve-media, NFS to Synology NAS (28TB, 22TB free):
| ID | Service | IP | Port | Notes |
|---|---|---|---|---|
| 220 | MeTube | 10.2.1.220 | 8081 | YouTube/web video downloader |
| 221 | Sonarr | 10.2.1.221 | 8989 | TV automation |
| 222 | Radarr | 10.2.1.222 | 7878 | Movie automation |
| 223 | Jellyfin | 10.2.1.223 | 8096 | Media server. Family guide hosted on nginx :8081. |
| 224 | Prowlarr | 10.2.1.224 | 9696 | Indexer manager |
| 225 | qBittorrent+PIA VPN | 10.2.1.225 | 8080 | Torrent client with built-in PIA kill switch |
| 226 | Lidarr | 10.2.1.226 | 8686 | Music automation |
| 227 | FileBot | 10.2.1.227 | 5800 | File renaming/organization |
| 228 | Music-Tools | 10.2.1.228 | — | Music processing utilities |
| 229 | Jellyseerr | 10.2.1.229 | 5055 | Media request management (Jellyfin-native fork of Overseerr). Docker. |
| 230 | Readarr | 10.2.1.230 | 8787 | Book/audiobook automation |
Smart Home
| ID | Service | IP | Port | Notes |
|---|---|---|---|---|
| 300 | Home Assistant OS 16.1 | 10.2.1.30 | 8123 | Full HAOS VM. Zigbee2MQTT :8080. SLZB-06M Zigbee coordinator on IoT VLAN. External: https://ha.grue.ai |
Development & AI
| ID | Service | IP | Port | Notes |
|---|---|---|---|---|
| 600 | Gitea | 10.2.1.60 | 3000 | Self-hosted Git. External: https://gitea.grue.ai |
| 610 | Transcriptor VM | 10.2.1.61 | 11434 | RTX 5060 passthrough. Whisper + Ollama-utility. Docker. 3AM cron batch. |
| 611 | Open WebUI | 10.2.1.62 | 3000 | Ollama web interface |
| 620 | Clawdbot VM | 10.2.1.65 | 18789+ | Phase Space host — 4 OpenClaw AI agents |
| 630 | code-quantum | 10.2.1.63 | 8080 | VSCode Server. External: https://code.grue.ai |
| 640 | data-quantum | 10.2.1.64 | — | SQL dev database |
| 670 | v8 MCP Server | 10.2.1.67 | — | Development MCP |
| 680 | MCP Quantum Context | 10.2.1.68 | 3456 | 16GB VM. Quantum, Perplexity, Vibe-check, Context7 (:3007), Ref (:3008), codebase-mcp (:3458) MCPs. PostgreSQL + 7727 contexts. 28ms avg embedding. |
| 690 | Ollama GPU | 10.2.1.69 | 11434 | 16GB VM. RTX 5090 passthrough. 29 models, 140GB on NFS. |
Total active containers/VMs: ~40 (LXCs + VMs across 3 nodes)
AI Stack
OpenClaw Multi-Agent System (“The Phase Space”)
Four specialized AI agents, each a separate OpenClaw gateway on VM 620 (Clawdbot, 10.2.1.65). Deployed February 2026. Isolated secrets, models, skills, memory collections, and workspaces per agent.
| Agent | Port | Model | Role |
|---|---|---|---|
| The Attractor | 18789 | Claude Opus 4.6 | Creative core, personal assistant, sole external voice. Telegram, Obsidian PKM, Perplexity deep research, image generation. |
| The Governor | 18800 | Claude Sonnet 4.5 | Infrastructure guardian. Proxmox, DNS, backups, monitoring. Destructive-Confirmation Protocol for all state changes. |
| The Gradient | 18900 | Claude Opus 4.6 | Engineering. Code repos, PRs, CI/CD, MCP development. |
| The Emission | 18901 | Gemini Flash | Public content airlock. Sanitizes output for external consumption. No shell, no internal IPs, no memory. |
Memory architecture: 2-layer
- Layer 1: Qdrant (localhost:6333, Docker) + mem0 plugin. Per-agent collections. Embeddings via nomic-embed-text (768-dim). Memory extraction via llama3.3:70b-instruct-q2_K.
- Layer 2: File-based (PHASE-SPACE.md, MEMORY.md, daily memory/YYYY-MM-DD.md)
Gemini two-lane architecture: Prevents API quota exhaustion.
- System Lane (ADC): free, used for heavy context tasks (log analysis, large file ingestion)
- Service Lane (API key): reserved for media generation and Emission agent
- Google AI Ultra plan: $250/month, 500 Pro prompts/day
Channels: Telegram (@Grueaibot) — exclusive to The Attractor. No other agent has messaging access.
Ollama Inference
Two GPU endpoints with automatic failover:
| Endpoint | GPU | VRAM | Speed | Primary use |
|---|---|---|---|---|
| 10.2.1.61:11434 | RTX 5060 | 8GB | ~187 tok/s | Embeddings, lightweight inference, Transcriptor |
| 10.2.1.69:11434 | RTX 5090 | 32GB | ~417 tok/s | Heavy inference, 70B models |
MCP Quantum Context uses 10.2.1.61 as primary (lower latency, same node as utility services), falls back to 10.2.1.69 automatically.
Notable model sizes: mistral-large is 73GB — larger than the RTX 5090’s 32GB VRAM, loaded via Ollama’s chunked loading. deepseek-r1:70b at 42GB fills most of VRAM.
Whisper Transcription Pipeline
VM 610 (Transcriptor, pve-utility, RTX 5060):
- OpenAI Whisper via Docker, GPU-accelerated
- NAS model cache at
/volume1/data/transcriptor/models - 22TB NAS storage available for source media
- Daily 3AM cron: batch-processes new video/audio files dropped in watched NAS directory
- Output: SRT/VTT subtitle files, transcripts
- SSH: [email protected]
Storage
Synology NAS — “Athena” (10.2.1.101)
| Detail | Value |
|---|---|
| Total capacity | 28 TB |
| Used | ~7 TB (25%) |
| Free | ~21 TB |
| Network | 10GbE (VLAN 60) to pve-utility; 1GbE to pve-media |
NFS volumes exported to cluster:
| Share | Mount | Consumer |
|---|---|---|
/volume1/Media_Library | /mnt/pve/media-library | Jellyfin, *arr stack |
/volume1/nextcloud | /mnt/pve/nextcloud-nfs | Nextcloud data |
/volume1/couchdb | /mnt/couchdb-nas | CouchDB/Obsidian |
/volume1/data/copyparty | /mnt/copyparty-nas | CopyParty file server |
/volume1/data/karakeep | /mnt/karakeep-nas | Karakeep assets |
/volume1/proxmox_backups | /mnt/pve/backups-1g | PBS secondary, LXC backups |
/volume1/proxmox_library | /mnt/pve/library-1g | VM templates, ISOs |
/volume1/data | Various | General data |
pve-utility Local Storage
| Storage | Type | Total | Used | Purpose |
|---|---|---|---|---|
utility-nvme | LVM thin | 921 GB | 128 GB (14%) | LXC rootfs, VM disks |
local | dir | 68 GB | 11 GB (16%) | ISO images, templates |
Proxmox Backup Server (PBS) — pve-media
| Detail | Value |
|---|---|
| Datastore | /mnt/pbs-nvme |
| Total | 458 GB NVMe |
| Used | 245 GB (57%) |
| Dedup factor | 67× |
| Prune policy | keep-last=3, keep-daily=7, keep-weekly=4, keep-monthly=2 |
| Secondary backup | NAS /volume1/proxmox_backups (1GbE, PBS → NAS sync) |
PBS stores compressed, deduplicated backups for all production LXCs and VMs. 67× dedup is real — backups of similar Debian LXCs compress and deduplicate aggressively.
Monitoring
Uptime Kuma
38 monitors. Notification channel: ntfy (self-hosted, 10.2.1.58). Every monitor sends push alerts to the uptime-alerts topic, delivered via ntfy app to phone.
Coverage: all production LXC services, VMs, external DNS resolution, Tailscale endpoints, MCP health endpoints.
Beszel
Agent-based system metrics (CPU, RAM, disk, network) for each container/VM. Better granularity than Prometheus node exporter for per-container views.
Prometheus + Grafana
- Prometheus scrapes: node exporters on all Proxmox hosts and key VMs, UniFi Poller, Home Assistant integration
- Grafana dashboards: cluster health, network bandwidth, VLAN traffic, GPU utilization, media stack activity
- InfluxDB: Home Assistant historical data (sensor history, energy monitoring)
- External: https://grafana.grue.ai (Cloudflare Access protected)
Network Hardware
| Device | Model | Notes |
|---|---|---|
| Router/Firewall | UniFi Dream Machine SE | UDM SE. 8-port 2.5GbE + 2× 10GbE SFP+ |
| Core switch | UniFi USW Aggregation | VLAN trunking |
| Access points | UniFi U7 Pro | Wi-Fi 7, VLAN-aware SSIDs |
| Zigbee | SLZB-06M | Ethernet Zigbee coordinator, IoT VLAN |
Automation
Ansible (LXC 130, 10.2.1.130):
- Manages: all 3 Proxmox hosts, 32 LXC containers, 6 VMs
- Playbooks:
update-lxc-containers.yml,update-vms.yml,update-proxmox-hosts.yml - Cron: daily OS updates at 3AM PT, 6-hour connectivity pings
- SSH key auth deployed to all managed hosts
OpenClaw agents run on cron (heartbeat + task scheduling) via built-in cron scheduler. The Governor monitors cluster health on each heartbeat and files GitHub issues for unresolved outages.
The Attractor’s Mac Nodes
Paired via OpenClaw node system to The Attractor (port 18789):
- pauls-mbp (Tailscale 100.111.17.71) — M3 Max 16-core, 64GB RAM
- calarts-mbp (Tailscale 100.98.171.89) — M3 Max 14-core, 36GB RAM
- airhead (Tailscale 100.80.38.71) — 2015 MacBook Air, NixOS
Security Posture
- All external services behind Cloudflare Access (Google OAuth, wildcard MFA)
- Internal services: VPN-only (Tailscale) or LAN-only
- No services exposed directly to internet except via Cloudflare tunnel
- Agent secrets: per-agent files with least-privilege scoping. Agents cannot access each other’s secrets by policy (soft boundary — same Linux user, enforced by convention).
- Silo VLAN (3) for isolated/untrusted workloads
- Guest WiFi (VLAN 1610) fully isolated from all internal networks
- qBittorrent always runs inside PIA VPN with kill switch
Fun Numbers
| Metric | Value |
|---|---|
| Total cluster RAM | 160 GB (64+64+32) |
| Total GPU VRAM | 40 GB (32+8) |
| Active LXCs + VMs | ~40 |
| Ollama models | 29 on RTX 5090, 2 on RTX 5060 |
| NAS free space | ~21 TB |
| PBS dedup factor | 67× |
| DNS monitors | 38 (Uptime Kuma) |
| Ansible-managed hosts | ~35 |
| AI agents | 4 (Attractor, Governor, Gradient, Emission) |
| MCP context store | 7,727 contexts (PostgreSQL) |
| Embedding latency | ~28ms avg (nomic-embed-text, RTX 5060) |
| Whisper batch schedule | 3AM daily, GPU-accelerated |
Draft generated 2026-02-18. IPs, credentials, and model versions current at time of writing. Sanitize before publishing: remove 10.2.x.x IPs, token references, and any credential hints.