Notes on .NET, XAF, and building things
Twenty years of XPO, application frameworks, and lately a lot of applied AI. 264 articles and counting.
Browse by topic
All topics →Latest articles
View all →
Control Your Android Phone From Your Desktop With scrcpy
A phone is a tiny screen you tap with one finger. A desktop has a real keyboard, a real pointer, and a 27-inch display. So why do I keep picking the phone up to do something I could do faster from the machine already in front of me? scrcpy fixes that: it puts a live, controllable window of your Android phone on your desktop — no app to install on the phone, no root, no cloud. Here's what it is, how it works, and the setup I actually use.

Brownfield Projects Are a Gold Mine for Training Agents
In my last post I described teaching an assistant my 'house style' by grading it against hidden golden cases. The obvious question is: where do you get the gold? Everybody's instinct is to start a clean little repo with tidy examples. That's exactly backwards. The richest training material I own isn't the shiny new project — it's the big, old, crusty brownfield beast nobody wants to touch. It's been quietly labeling a dataset for ten years. Here's why the mess is the treasure.

Teaching a Machine Your House Style
I have a 'house style' — that collection of small, stubborn opinions about how a thing should be built that I can no longer fully explain. A junior writes something that compiles, passes the tests, ships, and I still feel an itch on the back of my neck, because it isn't how we do it here. So I asked myself a more interesting question than 'can an AI write code': could I teach a machine my house style? Could I get it to write code that doesn't make me itch? This is the story of how I stopped asking the assistant to write good code and started giving it an exam it could fail.

One Key, One IP: A Self-Hosted AI Gateway for a Fleet of Agents
I run a small fleet of AI agents — coding agents, automation scripts, a few experiments — spread across a Mac, a Linux box and a couple of servers. Every one of them wanted its own set of API keys (OpenAI, OpenRouter, Azure), and every one of them called the providers from a different IP, which is a great way to get rate-limited and flagged. So I built a gateway: one box that holds the keys, exposes a single OpenAI-compatible endpoint, and makes every upstream call from one stable address. Here's the whole thing — LiteLLM, a forward proxy, and the two gotchas that cost me an hour.

A Self-Hosted SSH Mesh: Keyless Access to Every Machine With Headscale
I have machines scattered across the planet — a Mac Studio, a Linux laptop, a VPS — sitting behind different NATs, on different continents, with IP addresses that change without warning. Getting an SSH session from one to another used to mean port forwards, dynamic-DNS hacks, and a graveyard of public keys. So I built a mesh: a self-hosted Tailscale control plane with Headscale, where every machine gets a stable address and `ssh linux-laptop` just works from anywhere, with no keys to manage at all.
More topics
All topics →
Chat, Agent, Harness: The Three Layers of Building with AI
Three words get thrown around as if they were the same thing — chat, agent, harness — and they are not. They're three different layers, and once you see the boundaries between them, a lot of the AI-for-developers landscape suddenly makes sense. Here's how I think about the distinction, with small code sketches for each layer.

Microsoft Execution Containers (MXC): Build 2026's Answer to the Shared-Kernel Problem
A couple of days ago I wrote that namespaces are the operating-system feature AI agents were waiting for — and that the one real catch is the shared kernel. Turns out Microsoft spent Build 2026 answering exactly that. Microsoft Execution Containers (MXC) swap the shared kernel for hypervisor-enforced boundaries while keeping container-class speed: under 5% CPU overhead, 40–60 MB per container, dozens of agents on one workstation. Here's what it is and why I, a Windows person, am genuinely excited about it.

Namespaces: The Operating System Feature AI Agents Were Waiting For
Linux namespaces have been quietly sitting in the kernel since around 2008, powering every container you've ever run. I never thought much about them until I started running AI agents — and then it clicked. Namespaces are arguably a better fit for agents than they ever were for ordinary apps, because an agent is the one workload that is both cheap to spawn by the hundred and fundamentally untrustworthy.

Getting Started with Microsoft.Extensions.AI — Part 2: Messages & Strongly-Typed Output
Let's level up our AI interactions by building rich, multimodal messages and getting strongly-typed C# objects back from our models.

Microsoft's New AI Models from Build 2026: Aion and MAI, and How to Actually Use Them
At Build 2026 Microsoft shipped two very different kinds of AI model: Aion 1.0, a pair of small models that run on-device inside Windows, and the MAI family (Image-2.5, Transcribe-1.5), which live in the cloud. The interesting part isn't the benchmarks — it's where each one runs. Here's what they are and, more usefully, exactly how you can use each one depending on whether you're on a Mac, a Copilot+ PC, or just want a cloud API.