Every building is a real service; every animated dot a real control or data path, traced from the code at latest main across opportunity_harness · sports-analytics · homelab · homelab-ops · job-finder · agent-runner. Click a building to spotlight what it talks to · scroll to zoom · drag to pan · click legend rows to filter layers · Esc resets.
Push to main is the only deploy. Every stack ships the same way: a GitHub Action calls the reusable workflow in homelab-ops, SSHes into the rack box, writes the per-stack .env from a GitHub secret, and compose-builds. The rack box is one Ubuntu Docker host — every tower on the big platform is a container (agent-runner is the exception: launchd on the MacBook, LAN-only).
The tallest tower is the loop. opportunity_harness runs an in-process scheduler: an 8-second detection cycle (3s when an arb or crossing is live), a 30-minute maintenance window that grades every signal lane against realized outcomes, and ~20 read-only connectors pulling the sports/pred plane, the crypto plane, and the goods pads. Two special inputs: sports-analytics feeds it bettable book lines over /api/lines (DraftKings is scraped by Playwright that must egress the WireGuard sidecar — an IP-proof gate refuses otherwise), and the AI stack answers ask-the-desk questions with the rack GPU + SearXNG web search.
Everything else reads, never decides. homelab polls the harness actions feed and job-finder for its bench; the operator browses :8090/:3002, gets Resend digests in the inbox, and can fire a phone job at agent-runner, which runs headless Claude Code on a repo and pushes a branch back to GitHub — closing the loop.
claude -p → git push branch → GitHub [10]docker-compose.yml · Dockerfile · .github/workflows/deploy.yml (push→main = deploy via homelab-ops reusable workflow, health /healthz)homelab-ops SYSTEM.md §7 + scripts/set-env-secret.sh (per-stack .env in GH secrets); opportunity_harness/.github/workflows/ci.ymlopportunity_harness connectors/core/* — pred_markets.py, espn_schedule.py, odds_api.py, book_feeds.py, prophetx_direct.py, novig_direct.py, gemini_pred.py; collectors/{ebay,brickset,kroger,gtrends}.pyconnectors/core/{hyperliquid_funding,dydx_funding,backpack_funding,okx_funding,dex_perp_funding,cex_spot,defi_lend,jupiter_spot}.py · collectors/{defillama_yields,dexscreener,cross_chain,airdrop_radar}.py · tracking/hl_smart_money.pysports-analytics src/index.ts:649-676 · src/routes/lines.ts:15-34 · ARCHITECTURE.md:56-61 (harness reads /api/lines)sports-analytics docker-compose.yml:60-93 (WG + SOCKS5 sidecars) · src/services/scrape-policy.ts:68-94 (assertVpnEgress) · harness connectors/core/collector_lines.py:54 (_SKIP_VENUES)edge/docs/local-inference.md (GPU contract) · harness factory/llm_tools.py:31 (SearXNG) · factory/agent.py:148 (Ollama /v1) · factory/ai_health.py · live /api/tags 2026-08-17: gpt-oss:20b 13.8GB + qwen3:8bhomelab sidecar/src/bench.js:33-70 (/api/actions poll) + :21-22 (job-finder) · harness api/app.py:1321job-finder app.py:30-40 (in-process daily 13:00 UTC) · sources/__init__.py:5-9 (LinkedIn, Greenhouse, Lever, Ashby, jsearch, Workday) · llm.py:19-28 (Ollama fit score). No emailer in code — delivery is the web UIagent-runner agent_runner/main.py:65-121 (JobSummary contract) · runner.py:192-350 (git branch→claude -p→push) · launchd/com.bradsbots.agent-runner.plisthomelab-ops SYSTEM.md §4-5 (app catalog, ports) · §6 (LLM contract :11434/v1, agent run-log, backups 03:00→/mnt/raid)harness scripts/{dfs_apply_projections,bestball_build_pool,apply_prior_usage}.py — Sleeper API, nflverse stats_player_reg_2025.csv, dynastyprocess ECR → committed seeds (no live fetch in the loop)harness alerting/{email,daily_digest,funding_digest,pred_alerts}.py — Resend SDK; pred-crossing alerts every cycle, digest ≥7am ET