Your HTML Comments Are More Powerful Than You Think: Building Custom Validation Grammars with HtmlAgilityPackPublished on October 1, 2025 in 20 minutes to read We were getting ready to redesign and simplify phobos.petabridge.com - our Akka.NET observability platform documentation site. The plan was to remove a bunch of old pages, restructure the information architecture, and redirect everything properly so we wouldn’t break any inbound links from Google, Stack Overflow, or the blog posts referencing our documentation. The problem: how do we know we’re not blowing up external links during this restructuring? We needed full, measurable, observable control over the sitemap as we made changes. Every redirect had to work. Every removed page needed a destination. One broken link could cost us traffic and credibility. At its core, this is a continuous integration problem. So I built LinkValidator - a CLI tool to validate all internal and external links in our statically generated sites during CI/CD on Azure DevOps and GitHub Actions. The goal: fail the build if we break anything. Crawl the site, validate every link, and catch problems before they reach production. Then I hit an immediate problem. Our documentation has links to localhost resources - Grafana dashboards at I needed a way to selectively suppress link validation, and I wanted it to be contextual - right there in the HTML where the “broken” link lives, not buried in some global configuration file that’s completely divorced from the context of the page itself. Here’s how I built that in C# using HtmlAgilityPack and a little sprinkling of Akka.NET. ... |
I write about .NET, open source software, the Microsoft ecosystem, my adventures with startups, and outer space.
Software 2.0: Code is Cheap, Good Taste is Not Last week I shipped a feature that would have taken me ~4 days in about 45 minutes: 8 parallel solutions explored, 1 verified, reviewed, deployed. That's not vibe coding. It's a process. I'm calling it Software 2.0. Software 1.0 is software you specify. Software 2.0 is software you verify. I just published a long essay formalizing how I've been using LLMs to ship production software - not as a novelty, but as a disciplined engineering process...
Why Your Software Sucks: Inheritance Published on January 26, 2026 in 7 minutes to read “I have a great idea: let’s create a five-layer deep inheritance hierarchy with a universal base class that every domain object inherits from! That way, when requirements inevitably change, we’ll only need to touch… everything.” This is episode two of my Why Your Software Sucks video series, and today we’re talking about inheritance - specifically, how deep inheritance hierarchies turn your codebase into...
Why Am I Paying $40,000 for the Birth of My Child? Published on November 30, 2025 My third child arrives in a week. The cost? $40,000. Out of pocket. Cash. Not because something went wrong medically. That's just the price of admission for a self-employed entrepreneur who wants to grow a family while running a small business in America. $25,680 in annual premiums + $14,300 deductible = the privilege of bringing a new taxpayer into this world. I wrote about this because Michael Green's viral...