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 →
Jun 18, 20267 min read

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.

Jun 18, 20268 min read

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.

Jun 18, 20267 min read

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.

Jun 18, 20268 min read

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.

Jun 18, 20265 min read

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 →
Jun 18, 20266 min read

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.

Jun 17, 202611 min read

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.

Jun 17, 20268 min read

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.

Jun 17, 20268 min read

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.

Jun 16, 20269 min read

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.