Building Frank

Building Frank
A tutorial series on building an AI-hybrid Kubernetes homelab from scratch — each post walks through one layer of the stack.
The motivation behind Frank, the Talos Cluster — learning enterprise infrastructure and building interesting projects on your own hardware.
Bootstrapping a Talos Linux cluster with Omni, configuring node labels and zones, and replacing Flannel with Cilium's eBPF networking.
Setting up Longhorn distributed block storage across heterogeneous disks, including a GPU-local StorageClass for AI workloads.
Adding GPU compute to the cluster — the NVIDIA RTX 5070 saga, Intel Arc iGPU via DRA, and patching charts for bleeding-edge Kubernetes.
Migrating from Flux to ArgoCD with an App-of-Apps pattern — adopting existing workloads without downtime.
The most over-engineered RGB setup — controlling ARGB case fans from a Kubernetes DaemonSet via USB HID.
Deploying a resource-efficient observability stack with VictoriaMetrics, VictoriaLogs, and Grafana — and the three gotchas that made it interesting.
Configuring Longhorn backup targets with Cloudflare R2 — and the three Longhorn 1.11 gotchas that rewrote the original plan.
Replacing the SOPS-only secrets workflow with Infisical + ESO — and the three Infisical chart bugs that forced splitting one app into three.
A unified OpenAI-compatible gateway fronting a local RTX 5070 Ti running Ollama, built to route to OpenRouter's free tier as well — until that tier was dropped and the gateway made the change invisible to consumers.
A Kubernetes-native control plane where every AI agent is a Pod, every policy is a CRD, and every execution is a Job — orchestrated by Sympozium.
Getting NVIDIA GPU containers to actually run on Talos Linux — validation markers, machine-specific patches, nvidia default runtime, and the postStart hook trap.
One identity provider for every service — Authentik brings OIDC SSO to ArgoCD, Grafana, and Infisical, forward-auth proxy to Longhorn, Hubble, and the Tekton Dashboard, and OIDC-backed kubectl access.
Virtual Kubernetes clusters inside Frank — each one a disposable sandbox with its own control plane, resource quotas, and network policies, deployed via ArgoCD.
Deploying Paperclip — an AI orchestrator that organises agents into virtual companies with org charts and budgets — alongside Sympozium, to compare two fundamentally different agentic paradigms.
Running ComfyUI for video, image, and audio generation on the same GPU as Ollama — with a custom GPU Switcher dashboard to manage time-sharing.
Deploying a single-node Talos cluster on Hetzner Cloud as a public edge — Headscale mesh, Caddy reverse proxy, and everything that went wrong along the way.
Deploying a persistent Kali Linux container on gpu-1 as an always-on Claude Code workstation — because laptops sleep and mobile apps have limits.
Adding canary and blue-green deployment strategies to the cluster with Argo Rollouts — including a 39-day postmortem where the canary never actually ran.
Deploying per-user n8n instances on gpu-1 for workflow automation — with Authentik forward-auth, dedicated PostgreSQL, and Prometheus metrics.
Rebuilding the Kali workstation as a hardened, non-root pod with layered defenses — because giving an AI agent skip-permissions demands more than trust.
Adding feature-level health monitoring to the cluster — Blackbox probes for endpoints, Pushgateway for cron heartbeats, and Grafana alerting that fires to Telegram when things go silent.
A lightweight Go service that receives Grafana webhook alerts and automatically updates GitHub Project lifecycle states — turning monitoring signals into actionable project board updates.
Moving TLS termination and reverse proxying into the cluster with Traefik, Let's Encrypt wildcard certs, Authentik forward-auth, and a gethomepage.dev dashboard.
Deploying a relay server sidecar to tunnel the VK remote web UI through to the local agent's workspace data — because a dashboard that cannot show your work is not a dashboard.
The VibeKanban cloud announced shutdown with 30 days' notice. This is how we deployed the self-hosted remote crate — PostgreSQL, ElectricSQL, and a Rust API — before the lights went out.
Deploying a full Kubernetes-native CI/CD platform on pc-1 — Gitea for git mirroring, Tekton for pipelines, Zot for container images, and cosign for supply chain signing.
Splitting VibeKanban out of the Kali agent pod into a shared-volume sidecar, and moving Dockerfiles into a new multi-image repo with matrix CI and cross-repo dispatch.
Standing up ruvnet's claude-flow as a 24/7 hybrid pod — a ruvocal web UI plus a shell sidecar — to run as the chaotic-swarm counterpoint to Paperclip's org-chart agents.
A third blog series — research-grade landscape reviews framed as decisions, gated behind a committed dossier before any paper can be drafted.
Collectors on Hop, backend on Frank, AI alert enrichment that knows when 12x baseline is a scraper and when it is Hacker News.
An Ansible controller for the home-lab boxes Talos and ArgoCD cannot reach — two operators, four CrashLoops, a login page with no login, and a ping that finally said pong.
Retiring the custom agent-shell image and rebuilding hermes on Nous Research's official hermes-agent image as a three-container pod — bare official image, an SSH sidecar, and a self-hosted Hindsight memory backend.
Registering a vCluster as an ArgoCD cluster target crashed every app I run. The fix is six lines, and the order you apply them in matters.
GitHub Actions burned its free tier in 19 days, so the workflows now run on Frank's Gitea mirrors — same YAML, new engine, statuses flowing back
kubectl top was dead for months because nothing served metrics.k8s.io. The fix was one Talos flag and a decision I almost got wrong: build the fancy thing, or the right thing.
Embeddings and reranking on my control plane's idle Arc iGPUs via Kubernetes DRA, plus the CPU control arm that decided whether the accelerator earned it
