# Preston Bernstein > Personal site and blog of Preston Bernstein, a full-stack developer in Atlanta. The blog covers home-lab infrastructure, self-hosted services, networking, and practical AI/LLM engineering -- agent workflows, local inference, and observability -- written from firsthand builds and debugging sessions. ## Blog posts - [A Native Hugo Image Pipeline: WebP, LQIP Blur-Up, and Mermaid Diagrams](https://prestonbernstein.com/blog/native-hugo-image-pipeline-webp-lqip-and-mermaid/): Hugo render hooks gave this blog automatic WebP, srcset, and blur-up placeholders, plus Mermaid diagrams from plain fenced code blocks. No CDN, no theme fork. - [GitHub's Agents Tab Puts Claude and Codex in the Repo UI. It's a Separate Bill From Claude Code.](https://prestonbernstein.com/blog/github-agents-tab-vs-claude-code/): GitHub's Agents tab runs Claude or Codex against issues from the repo UI, live since January 2026 — billed through Copilot credits, not your Anthropic account. - [Rebuilding a Home Network from the Modem Up, One Phase at a Time](https://prestonbernstein.com/blog/rebuilding-home-network-from-the-modem-up/): The rebuild order that worked: ISP modem to passthrough, UniFi gateway and switch, Pi-hole DNS on a Pi controller, then downstream devices one at a time. - [A Clean ClamAV Scan Doesn't Mean the File Is Safe](https://prestonbernstein.com/blog/clamav-clean-scan-doesnt-mean-safe/): ClamAV only matches known signatures. My download scan gate now layers PUA detection, third-party feeds, YARA rules, hash-only lookups, and entropy checks. - [Why the XPS 17 Offload Box Runs Proxmox, Not Plain Ubuntu](https://prestonbernstein.com/blog/proxmox-for-the-xps-17-offload-box/): Proxmox VE beat Ubuntu-plus-Docker for a retired XPS 17 running five workloads: per-LXC isolation and snapshot rollback won, at the cost of an extra SSH hop. - [Run One Observability Stack, Not One Per Repo](https://prestonbernstein.com/blog/one-observability-stack-not-one-per-repo/): At ~30 repos and 15-20 always-on services, run one shared Grafana/Prometheus/Loki stack with an Alloy agent per host, not a stack per repo. - [Mini-ITX Is the Wrong Form Factor for a Quiet AI Home-Lab PC](https://prestonbernstein.com/blog/mini-itx-is-the-wrong-form-factor-for-a-quiet-ai-homelab-pc/): Mini-ITX forces small high-RPM fans and SFX PSUs: louder, less room to grow. mATX on an AM5 B650 board wins for a quiet, upgradable RTX 3060 inference box. - [Gaming Desktop or Dedicated Compute Box: Idle Power Decides, Not Sticker Price](https://prestonbernstein.com/blog/gaming-desktop-vs-dedicated-compute-box-idle-power/): A mini PC only cuts power costs if the desktop actually sleeps. Mine runs 24/7 for services, so the second box is about isolation, not watts. - [Not Every Docker Container Belongs on the NAS](https://prestonbernstein.com/blog/not-every-docker-container-belongs-on-the-nas/): Storage-coupled services stay on the NAS; compute-heavy projects move to a host with real memory. An 8GB DS1522+ under 35 containers forced the split. - [Fifteen of Eighteen Root Causes I Was Sure About Were Wrong](https://prestonbernstein.com/blog/adversarial-verification-home-lab-alerts/): Fifteen of eighteen proposed root causes for four firing alerts were refuted by three independent adversarial checks before any fix shipped. - [Shipping Fast Isn't the Same as Being Done: Auditing a CLI My Agent Pipeline Built in an Afternoon](https://prestonbernstein.com/blog/auditing-what-an-agent-pipeline-shipped-in-an-afternoon/): An agent pipeline built a working CLI in an afternoon. A separate audit still found four gaps: GitHub rate limits, an unsafe SQLite backup, no approval log. - [Three Failure Modes Wearing One Name: Running Concurrent Claude Code Agents Without State Drift](https://prestonbernstein.com/blog/three-failure-modes-one-name-concurrent-claude-code-agents/): 'State drift' across concurrent Claude Code agents was three problems: worktree sprawl (unused feature), deploy drift (ungeneralized), wasted compute (open). - [What If Two Independently-Built Agent Suites Reviewed Each Other's Code?](https://prestonbernstein.com/blog/dueling-agent-orchestration-suites/): A design sketch: two independently built agent suites reviewing each other's PRs. Self-review fails 64.5% per a study CodeRabbit cites. Nobody ships this yet. - [What a $364 Claude Code Session Taught Me About Running Agents Unattended](https://prestonbernstein.com/blog/what-a-364-dollar-claude-code-session-taught-me-about-agent-hygiene/): One Claude Code session cost $364: all spend from subagent fan-out and 8-hour sessions. Fixes: autocompact at 60%, SessionStart recovery hook, --max-turns. - [Building a Self-Throttling Governor for Claude Max With No Published Ceiling](https://prestonbernstein.com/blog/self-throttling-claude-max-without-a-published-ceiling/): Claude Max publishes no absolute usage ceiling, so my governor calibrates from real 429s, ramping claude -p cadence against 5-hour and 7-day rolling windows. - [RunPod Beats Gemini on Cost for My Vision Pipeline, and the Idle-Stop Feature It's Missing](https://prestonbernstein.com/blog/runpod-vs-gemini-vlm-inference-idle-auto-stop-gap/): Gemini wins on vision accuracy but RunPod wins on cost, as long as a watchdog calls podStop: dedicated RunPod pods have no idle auto-stop of their own. - [It Took Nine Fixes to Stop a LightRAG Crash. The First Eight Were All Real Bugs](https://prestonbernstein.com/blog/nine-fixes-lightrag-embedding-crash-one-afternoon/): Eight real fixes didn't stop a LightRAG crash. The host NAS was out of memory, 5GB deep in swap, stalling network I/O; the real fix was moving the workload. - [Tuning LightRAG Ingestion Concurrency Against a Rate-Limited Gemini API](https://prestonbernstein.com/blog/tuning-lightrag-ingestion-concurrency-against-gemini-rate-limits/): LightRAG marks a document FAILED on any Gemini 429. The biggest fix: EMBEDDING_BATCH_NUM was 2 instead of 32, causing 16x more requests, plus LiteLLM retries. - [No Embedding Server Survives a GPU Yield Gracefully. I Had to Build That Layer Myself](https://prestonbernstein.com/blog/surviving-a-gpu-yield-window-embedding-servers/): Ollama, TEI, Infinity, and llama.cpp all reject requests when the GPU disappears. My broker parks embedding requests up to 600s and replays them after a yield. - [My GPU Broker Kept Killing Inference Jobs for Games That Weren't Running](https://prestonbernstein.com/blog/debugging-false-positive-gpu-contention-detection/): My GPU broker canceled inference for games that weren't running: Plex maintenance uses the same transcoder binary, and one process match forced a cancel. - [Deciding What Fits: Inside My Resale-Clothing Monitor](https://prestonbernstein.com/blog/deciding-what-fits-resale-clothing-monitor/): Part 3 of 3: the resale monitor rejects 40-60% of listings with free rules before any model call, and its false-positive bias still has no counterweight. - [Deciding What's Worth a Saturday: Inside My Estate-Sale Scanner](https://prestonbernstein.com/blog/deciding-whats-worth-a-saturday-estate-sale-scanner/): Part 2 of 3: the estate-sale scanner treats a bad sale as bulk negative labels but a good sale as one positive, and three failures never threw an error. - [Scrape, Score, Alert: The Pattern Behind Two Home-Lab Vision Pipelines](https://prestonbernstein.com/blog/scrape-score-alert-resale-hunting-pipelines-local-vision-models/): Part 1: an estate-sale scanner and a resale monitor share one architecture — scrape, prefilter, score with local vision models, alert — on SQLite and one GPU. - [Step-by-Step Guide to Creating a Secure Docker Compose Script with VPN Integration](https://prestonbernstein.com/blog/secure-services-docker-compose-and-nordvpn/): How to route Docker services through a VPN container with network_mode: service:vpn in Docker Compose, and verify traffic actually exits through the VPN. ## Pages - [Home](https://prestonbernstein.com/): who I am and what I work on - [About](https://prestonbernstein.com/about/): professional bio and what I build - [Blog index](https://prestonbernstein.com/blog/): all posts - [Contact](https://prestonbernstein.com/contact/): how to reach me ## Feeds - [RSS](https://prestonbernstein.com/index.xml) - [Sitemap](https://prestonbernstein.com/sitemap.xml)