Notes on .NET, XAF, and building things

Twenty years of XPO, application frameworks, and lately a lot of applied AI. 220 articles and counting.

Browse by topic

All topics →

Latest articles

View all →
Apr 29, 20263 min read

From Frontier Models to Local Specialists: My Mac Studio Experiment

After getting access to a Mac Studio in Arizona, I explored running local AI models using tools like Ollama and LM Studio. Instead of chasing frontier-level intelligence, I focused on turning small open-source models into reliable specialists using RAG, fine-tuning, and constrained tools—prioritizing control, predictability, and real-world usefulness.

Mar 26, 20263 min read

How CLI Tools Can Drastically Reduce Token Consumption ⚡

After realizing that traditional tool schemas were burning tokens, I started looking for a lighter approach. CLI-style tools turned out to be a practical solution. By replacing verbose JSON schemas with simple commands, I reduced prompt size, improved tool selection, and made agents cheaper, faster, and easier to scale.

Mar 26, 20263 min read

From “Hello” to Quota Exceeded: The Day My Agent Broke 💥

After building an agent with 50 tools, I expected powerful automation. Instead, users hit quota limits after saying “Hello.” The problem wasn’t usage, it was hidden context cost. Every tool was injected into every request, burning tokens instantly. This experience revealed why tool design and loading strategy matter for scalable, efficient AI agents.

Feb 16, 202628 min read

The Day I Integrated GitHub Copilot SDK Inside My XAF App (Part 2)

In this second part, I integrate the GitHub Copilot SDK directly into a DevExpress XAF application, transforming a traditional business app into an AI-powered assistant. Using real tools, EF Core data, and DevExpress AI components, the system enables natural language interaction, record creation, and insights inside both Blazor and WinForms interfaces.

Feb 16, 20264 min read

The Day I Integrated GitHub Copilot SDK Inside My XAF App (Part 1)

This week, while studying Russian every day, I noticed I kept relying on GitHub Copilot inside VS Code more than anything else. That curiosity turned into an experiment: what if Copilot lived inside my XAF apps? It worked… after a four-hour rabbit hole of model-related timeouts.

More topics

All topics →
Feb 11, 20264 min read

Closing the Loop with AI (part 3): Moving the Human to the End of the Pipeline

Closing the loop with AI means moving the human to the end of the pipeline. Let agents write, run, test, read logs, inspect state, and iterate without you acting as QA. With Serilog, SQLite, and Playwright, the loop becomes observable and repeatable—until you only validate outcomes, not steps.

Feb 9, 20265 min read

Closing the Loop (Part 2): So Far, So Good — and Yes, It’s Token Hungry

Closing the loop is working better than I expected. Copilot writes code, runs Playwright tests, reads Serilog logs, checks screenshots, fixes bugs, and retries without me babysitting it. I’m writing this on my MacBook Air while my Surface runs tests. The only downside: it’s extremely token hungry.

Feb 9, 20265 min read

Closing the Loop: Letting AI Finish the Work

Getting sick on a ski trip led to an unexpected realization: the future of AI-assisted development isn’t just generating code faster, but closing the loop. By giving agents the ability to test, fail, and self-correct, we can move from endless prompting to true autonomous engineering — where humans define outcomes, not implementations.

Feb 4, 20265 min read

Github Copilot for the Rest of Us

GitHub Copilot isn’t just a code writer—it’s a context-aware work partner inside VS Code. With terminals, files, and Remote SSH, it helps diagnose and set up Linux servers, draft runbooks, and organize creative projects like storybooks. Treat it like a workspace companion, and the use cases multiply fast.

Jan 30, 20263 min read

The Mirage of a Memory Leak (or: why “it must be the framework” is usually wrong)

Memory leaks in managed runtimes are often mirages. What looks like a broken framework is usually memory retention caused by our own code: forgotten event unsubscriptions, captured lambdas, static references, and background services. Follow the GC roots, not the blame, and the illusion disappears.