Notes on .NET, XAF, and building things
Twenty years of XPO, application frameworks, and lately a lot of applied AI. 285 articles and counting.
Browse by topic
All topics →Latest articles
View all →
One Command to Generate, Test, Rank, and Merge an Agent Fan-Out
Over the last three posts I built the pieces of a best-of-N agent pipeline one at a time: git worktrees for isolation, a fan-out script to generate N attempts in parallel, and a judging stage to find the winner. This is the capstone — one ~50-line orchestrate.sh that chains all of it into a single command. You give it a count, an agent command, and a test command; it fans out, eliminates the runs that fail the tests, ranks the survivors, shows you the winning diff, and merges it only if you say yes. I built it, ran it end to end, and pasted the real output — including the one rough edge worth knowing about.

Judging the Winner: Tests and LLM-as-Judge as the Referee
The fan-out script from the last post hands you N finished attempts at the same task and then stops — it deliberately leaves the hardest question to you: which one is actually best? This post is about turning that judgment into a real pipeline. A two-stage referee: tests as the objective first cut that eliminates anything broken, then a quality judge — your eyes for small diffs, an LLM-as-judge when there are too many to read — to pick among the survivors. I built the test stage, ran it, and pasted the real output, then laid out the judging recipe and the ways it quietly lies to you.

A Real Agent Fan-Out: One Task, N Worktrees, Pick the Winner
In the last post I argued that git worktrees are the substrate that makes safe parallel agents possible. This is the hands-on follow-up: a small, real bash script that spins up N isolated worktrees, runs the same task in each one at the same time, and prints a diff summary so you can pick the best result and throw the rest away. I built it, ran it, and pasted the actual output. It's about forty lines, and once you see it work, the 'fan out, compare, keep the winner' pattern stops being a buzzword and becomes something you can run this afternoon.

Git Worktrees, and How Coding Agents Use Them
For years I treated a git repo as a single desk: one working directory, one branch checked out at a time, and a lot of stashing whenever I had to jump between tasks. Git worktrees quietly fix that — they let one repository have many working directories at once, each on its own branch, all sharing the same history. That used to be a nice convenience. Now that I run coding agents in parallel, it's become essential infrastructure: the cleanest way to let several agents work at the same time without clobbering each other. Here's what worktrees are, the handful of commands you actually need, and why every serious agent harness reaches for them.

Would an Agent Framework Fix It? What Microsoft and Copilot Change About LLM Code Migration — and What They Don't
In my last post I argued that when you point an LLM at a large legacy migration, the model is the easy part — the hard part is the harness around it. A fair follow-up question landed almost immediately: what if you don't hand-build that harness? What if you reach for a real agent framework — Microsoft Agent Framework, Semantic Kernel, Microsoft.Extensions.AI, or the GitHub Copilot SDK? Do the problems go away? The honest answer is that a good framework dissolves some of them outright and relocates the rest. The mechanical problems (feeding context, applying edits) largely vanish. The judgment problems (knowing when to stop, the domain rules, what 'done' means, measuring whether you're improving) are still yours, no matter how good the framework is.
More topics
All topics →
Automating a Legacy Migration with LLMs: The Model Was Never the Hard Part
If you have ever stared at a half-million-line legacy application and wondered whether an LLM could just migrate it for you, this post is for you. The short version: it can do a lot — but the model turns out to be the easy part. The hard part is everything around it. After pointing language models at a large legacy codebase, here are the lessons that actually mattered, and none of them are about prompt engineering: why the diff-apply approach fights you, why a model that refuses is doing you a favor, when to stop retrying, the framework wall you cannot code your way around, and why I landed on a hybrid of a structured pipeline and an agentic tool.

Decompiling and Recompiling .NET Apps — and How to Protect Your Binaries
Hand someone a .NET DLL and you've handed them most of your source code. C# doesn't compile to machine code — it compiles to IL, and the IL carries your class names, method names, and structure right along with it. The good news is that the same property makes great tools possible; the uncomfortable news is that anyone can read, patch, and recompile your app in an afternoon. Here's how decompilation actually works, a real decompile-patch-recompile loop, and the honest menu of things you can do to make it harder.

imgproxy: Getting Back the One Thing I Missed from Appcelerator Titanium
Sharing the same images between a mobile app and a web app — each sized right for its screen — is a problem I've been chasing for years. Back in my Appcelerator Titanium days, the cloud backend solved it for me: upload a photo once, get back properly sized versions for whoever asked. Then that service went away. imgproxy is how I get that capability back — self-hosted, open source, and serving every app in my fleet from a single URL.

Getting Started with Microsoft.Extensions.AI — Part 4: Tools, Functions & the Agent Framework
Let's empower our LLMs to interact with the real world by letting them call our C# code, then see how the Agent Framework elevates this to autonomous orchestration.

What Is Postiz? Self-Hosting Your Social Scheduling (and the Gotchas Nobody Warns You About)
Postiz is an open-source, self-hostable social media scheduler — think Buffer or Hootsuite, but running on your own box with your own API key. I moved my channels onto it and it's genuinely good. It also taught me four things the README is quiet about: a YouTube token that dies every seven days, two completely separate auth systems, a reschedule endpoint the public API can't touch, and the fact that some platforms simply won't talk to a personal account at all — they demand a business or creator account first. Here's what Postiz is, why you'd self-host it, and the gotchas so you don't lose an afternoon to them like I did.