{ "infra": { "cluster": "k0s", "nodes": 3, "arch": "arm64", "storage": "longhorn", "storage_class": "longhorn", "backup": "longhorn-backup + minio-to-mega" }, "hw": { "pi5_8gb": 2, "pi3_1gb": 1, "roles": { "control_plane": "pi5", "workers": ["pi5", "pi3"] } }, "net": { "metallb_pool": "192.168.153.240-192.168.153.254", "ingress_nginx_ip": "192.168.153.240", "ingress_haproxy_ip": "192.168.153.241", "tailnet": "taildb3494.ts.net", "dns_pattern": "...nip.io" }, "svc": { "gitops": "argocd", "monitoring": { "metrics": "kube-prometheus-stack", "logs": "loki-stack", "alerts": "alertmanager", "dashboards": "grafana" }, "ingress": ["nginx-ingress-controller", "haproxy-ingress"], "storage": ["longhorn", "local-path-storage", "minio"], "networking": ["metallb", "tailscale-operator"] }, "apps": { "ai_stack": { "namespace": "ai-stack", "components": ["open-webui", "ollama", "litellm", "searxng", "n8n", "vllm"], "models": ["gpt-oss:120b", "qwen3-coder"], "ollama_host": "100.85.116.57:11434" }, "home": ["home-assistant", "pihole", "plex"], "infra": ["gitea", "docker-registry", "kubernetes-dashboard"], "other": ["ghost", "tor-controller", "speedtest-tracker"] }, "namespaces": [ "ai-stack", "argocd", "monitoring", "loki-system", "longhorn-system", "metallb-system", "minio", "nginx-ingress-controller", "tailscale-operator", "gitea", "home-assistant", "pihole", "pihole2", "plex", "ghost", "kubernetes-dashboard", "docker-registry", "k8s-agent", "tools", "vpa" ], "urls": { "grafana": "grafana.monitoring.192.168.153.240.nip.io", "longhorn": "ui.longhorn-system.192.168.153.240.nip.io", "open_webui": "oi.ai-stack.192.168.153.240.nip.io", "searxng": "sx.ai-stack.192.168.153.240.nip.io", "n8n": "n8n.ai-stack.192.168.153.240.nip.io", "minio_console": "console.minio.192.168.153.240.nip.io", "pihole": "pihole.192.168.153.240.nip.io", "k8s_dashboard": "dashboard.kubernetes-dashboards.192.168.153.240.nip.io", "home_assistant": "ha.home-assistant.192.168.153.241.nip.io", "plex": "player.plex.192.168.153.246.nip.io" }, "external_llm": { "description": "Route requests to external LLMs via opencode or gemini CLI", "state_file": "~/.claude/state/external-mode.json", "router_dir": "~/.claude/mcp/llm-router/", "commands": { "toggle_on": "~/.claude/mcp/llm-router/toggle.py on --reason 'reason'", "toggle_off": "~/.claude/mcp/llm-router/toggle.py off", "status": "~/.claude/mcp/llm-router/toggle.py status", "invoke": "~/.claude/mcp/llm-router/invoke.py --model MODEL -p 'prompt'" }, "providers": ["opencode", "gemini"], "tiers": { "frontier": ["github-copilot/gpt-5.2", "github-copilot/gemini-3-pro-preview", "gemini/gemini-2.5-pro"], "mid-tier": ["github-copilot/gpt-5-mini", "github-copilot/claude-sonnet-4.5", "github-copilot/gemini-3-flash-preview", "opencode/grok-code", "gemini/gemini-2.5-flash"], "lightweight": ["opencode/gpt-5-nano", "zai-coding-plan/glm-4.5-air", "github-copilot/claude-haiku-4.5"] }, "task_routing": { "reasoning": "github-copilot/gpt-5.2", "code-generation": "github-copilot/gemini-3-pro-preview", "long-context": "gemini/gemini-2.5-pro", "fast": "github-copilot/gemini-3-flash-preview", "default": "github-copilot/claude-sonnet-4.5" }, "notes": { "opencode_path": "/home/linuxbrew/.linuxbrew/bin/opencode (NOT /usr/bin/opencode which crashes)", "o3_removed": "github-copilot/o3 not available via GitHub Copilot" } }, "workstation": { "hostname": "willlaptop", "ip": "192.168.153.117", "os": "Arch Linux", "desktop": "GNOME", "shell": "fish", "terminal": ["ghostty", "alacritty", "gnome-console"], "network": "systemd-networkd + iwd", "theme": "Dracula", "editors": ["vscode", "zed", "vim"], "browsers": ["firefox", "chromium", "google-chrome", "zen-browser", "epiphany"], "virtualization": ["docker", "podman", "distrobox", "virt-manager", "virtualbox", "gnome-boxes"], "k8s_tools": ["k9s", "k0s-bin", "k0sctl-bin", "argocd", "krew", "kubecolor"], "dev_langs": ["go", "rust", "python", "typescript", "zig", "bun", "node/npm/pnpm"], "ai_local": { "ollama": true, "llama_swap": true, "models": ["Qwen3-4b", "Gemma3-4b"] }, "backup": ["restic", "timeshift", "btrbk", "chezmoi"], "dotfiles": "chezmoi" }, "repos": { "willlaptop": { "path": "~/Code/active/devops/willlaptop", "remote": "git@gitea-gitea-ssh.taildb3494.ts.net:will/willlaptop.git", "purpose": "Workstation provisioning and config", "structure": { "ansible/": "Machine provisioning playbooks", "ansible/roles/common/": "Hostname, network, users, SSH config", "ansible/roles/packages/": "Package installation (pacman, AUR, flatpak, appimage)", "ansible/roles/packages/files/": "Package lists (pkglist.txt, aur_pkglist.txt, etc)", "docker/": "Local Docker stacks", "scripts/": "Utility scripts (backup, sync, networking)", "MCP/": "MCP server configs", "local_ollama/": "Local Ollama data" }, "ansible_tags": ["network", "wifi", "ethernet", "users", "sshd", "pacman", "aur", "flatpak", "appimage"], "docker_stacks": ["file_browser", "minio-longhorn-backup", "rancher-cleanup"], "scripts": ["bridge-up.sh", "chezmoi-sync.sh", "curl-s3.sh", "kvm-bridge-setup.sh", "rclone-sync.sh", "restic-backup.sh", "restic-clean.sh"] }, "homelab": { "path": "~/Code/active/devops/homelab/homelab", "remote": "git@github.com:will666/homelab.git", "symlink": "~/.claude/repos/homelab", "structure": { "ansible/": "Ansible playbooks and templates for node provisioning", "argocd/": "ArgoCD Application manifests (one per service)", "charts/": "Helm values and raw manifests per service", "charts//values.yaml": "Helm chart values override", "charts//manifests/": "Raw K8s manifests (non-Helm resources)", "docker/": "Docker Compose stacks for non-K8s workloads" }, "charts": [ "ai-stack", "argocd", "argo-workflow", "cdi-operator", "cloudflare-tunnel-ingress-controller", "docker-registry", "ghost", "gitea", "haproxy-ingress", "harbor", "home-assistant", "k0s-backup", "k8s-agent-dashboard", "kube-prometheus-stack", "kubernetes-dashboard", "kubevirt", "local-path-storage", "loki-stack", "longhorn", "longhorn-backup", "metallb", "minio", "minio-to-mega-backup", "nfs-server-longhorn", "nginx-ingress-controller", "pihole", "pihole2", "plex", "speedtest-tracker", "squareffect", "squareserver", "tailscale-operator", "tools", "tor-controller", "traefik-ingress-controller", "willlaptop-backup", "willlaptop-monitoring", "wills-portal" ], "docker_stacks": [ "protonvpn-proxy", "squareffect", "squareserver", "stable-diffusion-webui" ], "conventions": { "argocd_app": "argocd/.yaml points to charts//", "helm_values": "charts//values.yaml for Helm overrides", "raw_manifests": "charts//manifests/ for non-Helm K8s resources", "naming": "ArgoCD app name = namespace name (usually)" } } } }