<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Home on Preston Bernstein</title><link>https://prestonbernstein.com/</link><description>Recent content in Home on Preston Bernstein</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><managingEditor>contact@prestonbernstein.com (Preston Bernstein)</managingEditor><webMaster>contact@prestonbernstein.com (Preston Bernstein)</webMaster><copyright>© 2026 by Preston Bernstein. &lt;b&gt;All rights reserved.&lt;/b&gt;</copyright><lastBuildDate>Sat, 15 Aug 2026 19:10:00 +0000</lastBuildDate><atom:link href="https://prestonbernstein.com/index.xml" rel="self" type="application/rss+xml"/><item><title>A Native Hugo Image Pipeline: WebP, LQIP Blur-Up, and Mermaid Diagrams</title><link>https://prestonbernstein.com/blog/native-hugo-image-pipeline-webp-lqip-and-mermaid/</link><pubDate>Mon, 10 Aug 2026 18:00:00 +0000</pubDate><author>contact@prestonbernstein.com (Preston Bernstein)</author><guid>https://prestonbernstein.com/blog/native-hugo-image-pipeline-webp-lqip-and-mermaid/</guid><description>&lt;p&gt;This site had no image pipeline until this week. Every image in every post loaded at its original file size and format, usually a multi-megabyte PNG screenshot, with no responsive sizing and no loading placeholder.&lt;/p&gt;</description></item><item><title>GitHub's Agents Tab Puts Claude and Codex in the Repo UI. It's a Separate Bill From Claude Code.</title><link>https://prestonbernstein.com/blog/github-agents-tab-vs-claude-code/</link><pubDate>Mon, 10 Aug 2026 12:30:00 +0000</pubDate><author>contact@prestonbernstein.com (Preston Bernstein)</author><guid>https://prestonbernstein.com/blog/github-agents-tab-vs-claude-code/</guid><description>&lt;p&gt;GitHub&amp;rsquo;s per-repo Agents tab is a mission-control surface, &lt;a href="https://github.blog/changelog/2026-01-26-introducing-the-agents-tab-in-your-repository/" target="_blank" rel="noreferrer"&gt;live since January 26, 2026&lt;/a&gt;, where GitHub-hosted coding agents pick up issues and turn them into PRs. No terminal required. Copilot&amp;rsquo;s own agent lives there by default, and &lt;a href="https://github.blog/changelog/2026-02-04-claude-and-codex-are-now-available-in-public-preview-on-github/" target="_blank" rel="noreferrer"&gt;Claude and Codex have been selectable alongside it in public preview since February 4, 2026&lt;/a&gt;. The tab is part of &lt;strong&gt;Agent HQ&lt;/strong&gt;, the umbrella &lt;a href="https://github.blog/news-insights/company-news/welcome-home-agents/" target="_blank" rel="noreferrer"&gt;GitHub announced on October 28, 2025&lt;/a&gt;, meant to give every agent vendor one shared surface across Issues, PRs, and Actions.&lt;/p&gt;</description></item><item><title>Rebuilding a Home Network from the Modem Up, One Phase at a Time</title><link>https://prestonbernstein.com/blog/rebuilding-home-network-from-the-modem-up/</link><pubDate>Mon, 10 Aug 2026 12:25:00 +0000</pubDate><author>contact@prestonbernstein.com (Preston Bernstein)</author><guid>https://prestonbernstein.com/blog/rebuilding-home-network-from-the-modem-up/</guid><description>&lt;p&gt;I rebuilt my home network from the ISP modem outward instead of dropping in a new router and hoping the rest of the stack sorted itself out. The order was fixed:&lt;/p&gt;</description></item><item><title>A Clean ClamAV Scan Doesn't Mean the File Is Safe</title><link>https://prestonbernstein.com/blog/clamav-clean-scan-doesnt-mean-safe/</link><pubDate>Mon, 10 Aug 2026 12:20:00 +0000</pubDate><author>contact@prestonbernstein.com (Preston Bernstein)</author><guid>https://prestonbernstein.com/blog/clamav-clean-scan-doesnt-mean-safe/</guid><description>&lt;p&gt;A clean ClamAV scan means nothing matched a known signature. It does not mean the file is safe. I run a scan gate in front of my media-download pipeline: everything that lands from the download clients gets checked by a ClamAV daemon before it&amp;rsquo;s allowed into the library. (The pipeline sits on the placement split from &lt;a href="https://prestonbernstein.com/blog/not-every-docker-container-belongs-on-the-nas/" &gt;Not every Docker container belongs on the NAS&lt;/a&gt;.)&lt;/p&gt;</description></item><item><title>Why the XPS 17 Offload Box Runs Proxmox, Not Plain Ubuntu</title><link>https://prestonbernstein.com/blog/proxmox-for-the-xps-17-offload-box/</link><pubDate>Mon, 10 Aug 2026 12:15:00 +0000</pubDate><author>contact@prestonbernstein.com (Preston Bernstein)</author><guid>https://prestonbernstein.com/blog/proxmox-for-the-xps-17-offload-box/</guid><description>&lt;p&gt;Proxmox VE, one LXC per workload. I think I made the right choice, and I feel good about the reuse: I wouldn&amp;rsquo;t buy a laptop to do this, but I&amp;rsquo;m happy I found an economical use for one that was already here.&lt;/p&gt;</description></item><item><title>Run One Observability Stack, Not One Per Repo</title><link>https://prestonbernstein.com/blog/one-observability-stack-not-one-per-repo/</link><pubDate>Mon, 10 Aug 2026 12:10:00 +0000</pubDate><author>contact@prestonbernstein.com (Preston Bernstein)</author><guid>https://prestonbernstein.com/blog/one-observability-stack-not-one-per-repo/</guid><description>&lt;p&gt;Run one shared Grafana and Prometheus stack for your whole home lab, not one per repo. I&amp;rsquo;ve got around 30 GitHub repos and 15-20 always-on self-hosted services, running mostly on one desktop plus a NAS (&lt;a href="https://prestonbernstein.com/blog/not-every-docker-container-belongs-on-the-nas/" &gt;split by the placement framework from an earlier post&lt;/a&gt;).&lt;/p&gt;</description></item><item><title>Mini-ITX Is the Wrong Form Factor for a Quiet AI Home-Lab PC</title><link>https://prestonbernstein.com/blog/mini-itx-is-the-wrong-form-factor-for-a-quiet-ai-homelab-pc/</link><pubDate>Mon, 10 Aug 2026 12:05:00 +0000</pubDate><author>contact@prestonbernstein.com (Preston Bernstein)</author><guid>https://prestonbernstein.com/blog/mini-itx-is-the-wrong-form-factor-for-a-quiet-ai-homelab-pc/</guid><description>&lt;p&gt;Form factor is the call that matters most on this build, and the popular answer gets it wrong. Every &amp;ldquo;quiet home-lab PC&amp;rdquo; guide points at mini-ITX: small, tucked in a corner, low power draw.&lt;/p&gt;</description></item><item><title>Gaming Desktop or Dedicated Compute Box: Idle Power Decides, Not Sticker Price</title><link>https://prestonbernstein.com/blog/gaming-desktop-vs-dedicated-compute-box-idle-power/</link><pubDate>Mon, 10 Aug 2026 12:00:00 +0000</pubDate><author>contact@prestonbernstein.com (Preston Bernstein)</author><guid>https://prestonbernstein.com/blog/gaming-desktop-vs-dedicated-compute-box-idle-power/</guid><description>&lt;p&gt;Idle power draw, not the price tag stamped on the mini PC, decides whether a dedicated low-power compute box actually saves you money over a gaming desktop. A gaming desktop idles around 80-200W, depending on the board, the PSU, and how many drives happen to be spinning. A purpose-built low-power box, the N100-class mini PCs and similar, idles at 10-15W.&lt;/p&gt;</description></item><item><title>Not Every Docker Container Belongs on the NAS</title><link>https://prestonbernstein.com/blog/not-every-docker-container-belongs-on-the-nas/</link><pubDate>Mon, 10 Aug 2026 11:55:00 +0000</pubDate><author>contact@prestonbernstein.com (Preston Bernstein)</author><guid>https://prestonbernstein.com/blog/not-every-docker-container-belongs-on-the-nas/</guid><description>&lt;p&gt;Family-facing and storage-coupled services stay on the NAS. Compute-heavy personal projects move to a separate host with real memory to spare. That&amp;rsquo;s the whole framework, and it took months of pain to earn: a Synology DS1522+ with 8GB of RAM, roughly 35 Docker containers, and a box that kept falling over under memory pressure.&lt;/p&gt;</description></item><item><title>Fifteen of Eighteen Root Causes I Was Sure About Were Wrong</title><link>https://prestonbernstein.com/blog/adversarial-verification-home-lab-alerts/</link><pubDate>Mon, 10 Aug 2026 11:50:00 +0000</pubDate><author>contact@prestonbernstein.com (Preston Bernstein)</author><guid>https://prestonbernstein.com/blog/adversarial-verification-home-lab-alerts/</guid><description>&lt;p&gt;Fifteen of eighteen root causes I proposed for four firing alerts turned out to be wrong. Four alerts were going off across my home infrastructure at once: a stuck download post-processing backlog, plus three separate automation alerts tied to a video-discovery pipeline.&lt;/p&gt;</description></item><item><title>Shipping Fast Isn't the Same as Being Done: Auditing a CLI My Agent Pipeline Built in an Afternoon</title><link>https://prestonbernstein.com/blog/auditing-what-an-agent-pipeline-shipped-in-an-afternoon/</link><pubDate>Mon, 10 Aug 2026 11:45:00 +0000</pubDate><author>contact@prestonbernstein.com (Preston Bernstein)</author><guid>https://prestonbernstein.com/blog/auditing-what-an-agent-pipeline-shipped-in-an-afternoon/</guid><description>&lt;p&gt;Shipping fast is not the same as being done. I learned that the expensive way, on a CLI tool my own agent pipeline built in one afternoon.&lt;/p&gt;</description></item><item><title>Three Failure Modes Wearing One Name: Running Concurrent Claude Code Agents Without State Drift</title><link>https://prestonbernstein.com/blog/three-failure-modes-one-name-concurrent-claude-code-agents/</link><pubDate>Mon, 10 Aug 2026 11:40:00 +0000</pubDate><author>contact@prestonbernstein.com (Preston Bernstein)</author><guid>https://prestonbernstein.com/blog/three-failure-modes-one-name-concurrent-claude-code-agents/</guid><description>&lt;p&gt;Three failure modes were hiding behind one name, and only one of them was actually about drift. I run four or five Claude Code agents at once, each in its own repo, and for months every mess that came out of it got filed under the same complaint: things drifting out of state while I wasn&amp;rsquo;t watching. Pulled apart, the three landed in very different places:&lt;/p&gt;</description></item><item><title>What If Two Independently-Built Agent Suites Reviewed Each Other's Code?</title><link>https://prestonbernstein.com/blog/dueling-agent-orchestration-suites/</link><pubDate>Mon, 10 Aug 2026 11:35:00 +0000</pubDate><author>contact@prestonbernstein.com (Preston Bernstein)</author><guid>https://prestonbernstein.com/blog/dueling-agent-orchestration-suites/</guid><description>&lt;p&gt;Run two coding-agent orchestration suites that share nothing between them (no prompts, no config, no instruction derivation) and make them review each other&amp;rsquo;s pull requests, the way two engineers who never compared notes catch each other&amp;rsquo;s mistakes. Suite A opens a PR. Suite B, built from scratch with zero visibility into how A works, reviews it cold. Suite A reads the verdict, decides what&amp;rsquo;s real, fixes what needs fixing, and the loop can run again from there.&lt;/p&gt;</description></item><item><title>What a $364 Claude Code Session Taught Me About Running Agents Unattended</title><link>https://prestonbernstein.com/blog/what-a-364-dollar-claude-code-session-taught-me-about-agent-hygiene/</link><pubDate>Mon, 10 Aug 2026 11:30:00 +0000</pubDate><author>contact@prestonbernstein.com (Preston Bernstein)</author><guid>https://prestonbernstein.com/blog/what-a-364-dollar-claude-code-session-taught-me-about-agent-hygiene/</guid><description>&lt;p&gt;You can write great code with agents. I believe that now. But they&amp;rsquo;re pretty bad on their own without manual review at the beginning and end of every initiative. That&amp;rsquo;s what a $364 Claude Code session taught me. I found the number on a quiet Sunday morning, checking on the automated processes I&amp;rsquo;d kicked off the night before.&lt;/p&gt;</description></item><item><title>Building a Self-Throttling Governor for Claude Max With No Published Ceiling</title><link>https://prestonbernstein.com/blog/self-throttling-claude-max-without-a-published-ceiling/</link><pubDate>Mon, 10 Aug 2026 11:25:00 +0000</pubDate><author>contact@prestonbernstein.com (Preston Bernstein)</author><guid>https://prestonbernstein.com/blog/self-throttling-claude-max-without-a-published-ceiling/</guid><description>&lt;p&gt;Anthropic will not tell you how many tokens or messages Claude Max 20x actually gives you, and I had to build a throttle for it anyway. I run several personal research projects on background schedules through &lt;code&gt;claude -p&lt;/code&gt; — unattended fires that call Claude Code from cron and systemd timers while I&amp;rsquo;m not watching. Those fires draw from the &lt;strong&gt;exact same quota&lt;/strong&gt; as the interactive Claude Code sessions I use to do actual work.&lt;/p&gt;</description></item><item><title>RunPod Beats Gemini on Cost for My Vision Pipeline, and the Idle-Stop Feature It's Missing</title><link>https://prestonbernstein.com/blog/runpod-vs-gemini-vlm-inference-idle-auto-stop-gap/</link><pubDate>Mon, 10 Aug 2026 11:20:00 +0000</pubDate><author>contact@prestonbernstein.com (Preston Bernstein)</author><guid>https://prestonbernstein.com/blog/runpod-vs-gemini-vlm-inference-idle-auto-stop-gap/</guid><description>&lt;p&gt;Gemini wins on accuracy. RunPod wins on cost. I run vision-model inference for a personal image pipeline on RunPod GPUs instead of calling Google&amp;rsquo;s Gemini API, and that split is the whole decision, not a verdict on which model is smarter.&lt;/p&gt;</description></item><item><title>It Took Nine Fixes to Stop a LightRAG Crash. The First Eight Were All Real Bugs</title><link>https://prestonbernstein.com/blog/nine-fixes-lightrag-embedding-crash-one-afternoon/</link><pubDate>Mon, 10 Aug 2026 11:15:00 +0000</pubDate><author>contact@prestonbernstein.com (Preston Bernstein)</author><guid>https://prestonbernstein.com/blog/nine-fixes-lightrag-embedding-crash-one-afternoon/</guid><description>&lt;p&gt;A bulk-reprocess job against one of my LightRAG instances crashed three times in one afternoon, and I shipped eight legitimate fixes before I found the actual cause. That same afternoon I also fixed &lt;a href="https://prestonbernstein.com/blog/debugging-false-positive-gpu-contention-detection/" &gt;a false-positive bug in the GPU broker&lt;/a&gt; that arbitrates my home GPU between gaming and local inference.&lt;/p&gt;</description></item><item><title>Tuning LightRAG Ingestion Concurrency Against a Rate-Limited Gemini API</title><link>https://prestonbernstein.com/blog/tuning-lightrag-ingestion-concurrency-against-gemini-rate-limits/</link><pubDate>Mon, 10 Aug 2026 11:10:00 +0000</pubDate><author>contact@prestonbernstein.com (Preston Bernstein)</author><guid>https://prestonbernstein.com/blog/tuning-lightrag-ingestion-concurrency-against-gemini-rate-limits/</guid><description>&lt;p&gt;Feeding a few hundred books into LightRAG through Gemini taught me that concurrency tuning is the wrong first lever, and that the rate-limit table you&amp;rsquo;d normally tune it against doesn&amp;rsquo;t exist anymore anyway. I run a personal knowledge-graph project that ingests close to a thousand book-length documents through &lt;a href="https://github.com/HKUDS/LightRAG" target="_blank" rel="noreferrer"&gt;LightRAG&lt;/a&gt; (HKUDS), using Gemini for entity extraction and embeddings behind a LiteLLM proxy. The corpus is entity-dense enough that the LLM merge phase dominates ingestion time.&lt;/p&gt;</description></item><item><title>No Embedding Server Survives a GPU Yield Gracefully. I Had to Build That Layer Myself</title><link>https://prestonbernstein.com/blog/surviving-a-gpu-yield-window-embedding-servers/</link><pubDate>Mon, 10 Aug 2026 11:05:00 +0000</pubDate><author>contact@prestonbernstein.com (Preston Bernstein)</author><guid>https://prestonbernstein.com/blog/surviving-a-gpu-yield-window-embedding-servers/</guid><description>&lt;p&gt;Every embedding server I tested handles a vanished GPU the same way: queue requests until a buffer fills, then reject them. Ollama does this. TEI does this. Infinity and llama.cpp do it too, with different buffer sizes and different error codes but the same outcome. None of them pause a request and wait out a short outage; they drop it the moment the queue overflows or a limit is hit.&lt;/p&gt;</description></item><item><title>My GPU Broker Kept Killing Inference Jobs for Games That Weren't Running</title><link>https://prestonbernstein.com/blog/debugging-false-positive-gpu-contention-detection/</link><pubDate>Mon, 10 Aug 2026 11:00:00 +0000</pubDate><author>contact@prestonbernstein.com (Preston Bernstein)</author><guid>https://prestonbernstein.com/blog/debugging-false-positive-gpu-contention-detection/</guid><description>&lt;p&gt;My GPU broker kept canceling live inference jobs over games that weren&amp;rsquo;t running. Most of the time, nothing had launched at all.&lt;/p&gt;</description></item><item><title>Deciding What Fits: Inside My Resale-Clothing Monitor</title><link>https://prestonbernstein.com/blog/deciding-what-fits-resale-clothing-monitor/</link><pubDate>Mon, 10 Aug 2026 10:10:00 +0000</pubDate><author>contact@prestonbernstein.com (Preston Bernstein)</author><guid>https://prestonbernstein.com/blog/deciding-what-fits-resale-clothing-monitor/</guid><description>&lt;p&gt;My resale-clothing monitor&amp;rsquo;s hardest problem isn&amp;rsquo;t finding new listings. It&amp;rsquo;s deciding which ones fit my taste well enough to interrupt me over, and the design leans hard toward &lt;strong&gt;false positives over false negatives&lt;/strong&gt;, a call I can defend today but haven&amp;rsquo;t actually stress-tested.&lt;/p&gt;</description></item><item><title>Deciding What's Worth a Saturday: Inside My Estate-Sale Scanner</title><link>https://prestonbernstein.com/blog/deciding-whats-worth-a-saturday-estate-sale-scanner/</link><pubDate>Mon, 10 Aug 2026 10:05:00 +0000</pubDate><author>contact@prestonbernstein.com (Preston Bernstein)</author><guid>https://prestonbernstein.com/blog/deciding-whats-worth-a-saturday-estate-sale-scanner/</guid><description>&lt;p&gt;My estate-sale scanner has one job: decide which of a week&amp;rsquo;s new listings deserve an actual Saturday. The scraping is boring. What&amp;rsquo;s interesting is how the system scores photos nobody&amp;rsquo;s labeled, and an asymmetric feedback loop that treats a good sale and a bad sale as completely different kinds of evidence. This is part 2 of a series; &lt;a href="https://prestonbernstein.com/blog/scrape-score-alert-resale-hunting-pipelines-local-vision-models/" &gt;part 1&lt;/a&gt; covers the shared architecture and GPU constraints behind this project and a second one.&lt;/p&gt;</description></item><item><title>Scrape, Score, Alert: The Pattern Behind Two Home-Lab Vision Pipelines</title><link>https://prestonbernstein.com/blog/scrape-score-alert-resale-hunting-pipelines-local-vision-models/</link><pubDate>Mon, 10 Aug 2026 10:00:00 +0000</pubDate><author>contact@prestonbernstein.com (Preston Bernstein)</author><guid>https://prestonbernstein.com/blog/scrape-score-alert-resale-hunting-pipelines-local-vision-models/</guid><description>&lt;p&gt;Two personal tools I&amp;rsquo;ve built, an estate-sale scanner and a resale-clothing monitor, run on the exact same architecture: scrape listings, score every photo with a local vision model, surface only the ones worth my attention. Same four stages, same database, same GPU, underneath two very different projects.&lt;/p&gt;</description></item><item><title>Step-by-Step Guide to Creating a Secure Docker Compose Script with VPN Integration</title><link>https://prestonbernstein.com/blog/secure-services-docker-compose-and-nordvpn/</link><pubDate>Mon, 01 Jul 2024 22:01:16 +0000</pubDate><author>contact@prestonbernstein.com (Preston Bernstein)</author><guid>https://prestonbernstein.com/blog/secure-services-docker-compose-and-nordvpn/</guid><description>&lt;h2 class="relative group"&gt;Docker Containers Inherit Your Connection&amp;rsquo;s Exposure by Default
 &lt;div id="docker-containers-inherit-your-connections-exposure-by-default" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#docker-containers-inherit-your-connections-exposure-by-default" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;Docker containers share the host&amp;rsquo;s network stack by default.&lt;/p&gt;</description></item><item><title>About</title><link>https://prestonbernstein.com/about/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>contact@prestonbernstein.com (Preston Bernstein)</author><guid>https://prestonbernstein.com/about/</guid><description>&lt;p&gt;I&amp;rsquo;m Preston Bernstein, a full-stack developer based in Atlanta, GA, with over ten years of experience across front-end and back-end work. My professional focus is building and optimizing web applications; my off-hours focus is the infrastructure underneath them.&lt;/p&gt;</description></item><item><title>Privacy</title><link>https://prestonbernstein.com/privacy-policy/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>contact@prestonbernstein.com (Preston Bernstein)</author><guid>https://prestonbernstein.com/privacy-policy/</guid><description>&lt;h4 class="relative group"&gt;Responsibility of Contributors
 &lt;div id="responsibility-of-contributors" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#responsibility-of-contributors" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h4&gt;
&lt;p&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Purus, donec nunc eros, ullamcorper id feugiat quisque aliquam sagittis. Sem turpis sed viverra massa gravida pharetra. Non dui dolor potenti eu dignissim fusce. Ultrices amet, in curabitur a arcu a lectus morbi id. Iaculis erat sagittis in tortor cursus. Molestie urna eu tortor, erat scelerisque eget. Nunc hendrerit sed interdum lacus. Lorem quis viverra sed&lt;/p&gt;</description></item></channel></rss>