Notes on .NET, XAF, and building things
Twenty years of XPO, application frameworks, and lately a lot of applied AI. 254 articles and counting.
Browse by topic
All topics →Latest articles
View all →
EnvPane: How a Windows Person Manages Environment Variables on a Mac
I'm a Windows person at heart — Windows Terminal just feels right, especially how trivially you can bump the font size. The macOS Terminal never clicked for me, so I never settled into the 'edit your shell rc' way of managing environment variables. And I have a lot of them: API keys and secrets for AI agents and day-to-day dev. EnvPane is the little preference pane that solved it — a GUI list of variables, applied to every app instantly.

Getting Started with Microsoft.Extensions.AI — Part 1: One Interface, Any Model
Discover how `Microsoft.Extensions.AI` provides a single `IChatClient` interface to seamlessly swap between cloud and local LLM providers with just one line of code.

Microsoft VibeVoice: Frontier Open-Source Voice AI, and How to Run It Locally
VibeVoice is Microsoft's open-source frontier voice-AI family — long-form, multi-speaker podcasts from text, a real-time streaming TTS model, and a 60-minute ASR model. It's also a cautionary tale: the headline TTS model was pulled over deepfake misuse. Here's what it does, the clever 7.5 Hz architecture behind it, and exactly how to run the parts you still can locally — including on Apple Silicon.

Graphify: Turn Any Folder Into a Knowledge Graph Your LLM Can Actually Use
Pointing an AI coding assistant at a big codebase means it re-reads the same raw files over and over, burning tokens and blowing past the context window. Graphify does the expensive analysis once and compresses a whole folder — code, PDFs, screenshots, diagrams — into a queryable knowledge graph the LLM traverses instead. On a real mixed corpus: 71.5× fewer tokens per query.

Stop Feeding LLMs Raw Files: Save Tokens with Microsoft MarkItDown (CLI + MCP)
Every PDF, Word doc, spreadsheet, or web page you hand an LLM gets paid for in tokens — and raw formats are full of markup the model doesn't need. Microsoft's MarkItDown converts all of them to clean, token-efficient Markdown. I measured a real page: 793 KB of HTML became 304 KB of Markdown — about 62% fewer tokens. Here's the tool, its CLI, and its MCP server.
More topics
All topics →
Making a Country Legible to AI: My mcp.sv Hobby Project
mcp.sv is a hobby project of mine with one goal: make the whole state of El Salvador visible from one place, to any AI client. This is the reflective version — why I built it, what it covers today (279 documents across 11 categories), and the real question underneath it: what does it actually take to make a country legible to an AI?

How mcp.sv Does Multilingual Search and Structured RAG
mcp.sv — the El Salvador national MCP — has to answer questions about Salvadoran law and government in Spanish, English, and Russian, over documents that are almost entirely Spanish. Here's how it does it: not with one big multilingual model at query time, but with layers — synthetic cross-language aliases, language-specific full-text search, heading-aware structured chunking, and a hybrid keyword+vector blend, all precomputed so the read path stays fast and inference-free.

Set XAF Blazor ViewItems Free: Direct URLs, Parameters, and a REST API
An XAF ViewItem is normally trapped inside the app — reachable only after login and navigation. No shareable link, no URL parameters, no way to call it from a bot. Here's a pattern that frees it: build the ViewItem's UI as a plain Blazor component, then surface that one component three ways — the XAF ViewItem, a routable /chat?message=… page, and a REST API.

Getting Started with Semantic Kernel — Part 3: Running Local Models (LM Studio / Ollama)
In the final part of our Semantic Kernel series, I'll show you how to run your Semantic Kernel applications against local LLMs like LM Studio or Ollama, completely eliminating cloud costs while keeping your existing kernel code almost untouched.

Why We Added JWT Refresh Tokens to the XAF Web API (and How)
The XAF Web API hands you JWT authentication out of the box — but with a long-lived, stateless access token you can't revoke. That's a security problem and a UX problem. Here's why we layered refresh tokens with rotation and reuse-detection onto XAF's security system, and the real XPO-backed code that does it.