Notes on .NET, XAF, and building things
Twenty years of XPO, application frameworks, and lately a lot of applied AI. 233 articles and counting.
Browse by topic
All topics →Latest articles
View all →
Integrating Keycloak Authentication into a DevExpress XAF Blazor App
A complete, working recipe for wiring Keycloak OpenID Connect into a DevExpress XAF Blazor Server app — the auth provider, the bridge middleware, the three-layer logout, and the one checkbox (PKCE) that wastes everyone's afternoon. Full source on GitHub.

Getting Started with the GitHub Copilot SDK — Part 11: Bring Your Own Key (BYOK) with OpenRouter
The final part of the series: point the Copilot SDK at any model — OpenRouter, Anthropic, Azure OpenAI, xAI — through Bring Your Own Key. No new SDK, no direct API calls. Custom models just show up in your model list.

Getting Started with the GitHub Copilot SDK — Part 10: A Full-Stack Blazor Chat App
Part 10 wires everything together — a Blazor Server chat app that talks to the GitHub Copilot SDK, calls real EF Core tools against a Northwind database, and renders markdown answers in the browser.

Getting Started with the GitHub Copilot SDK — Part 9: MCP Servers & Custom Agents
Part 9 of the GitHub Copilot SDK series: wire external MCP tool servers into a session and define named custom agents with their own prompts, tool limits, and isolated MCP connections — then combine both into a real agent architecture.

Getting Started with the GitHub Copilot SDK — Part 8: Skill Loading & Configuration
Part 8 of the GitHub Copilot SDK series. Skills are plain Markdown files that reshape how the model behaves — no code changes, no system-prompt surgery. We load one, prove it works, disable it by name, and build one at runtime.
More topics
All topics →
Getting Started with the GitHub Copilot SDK — Part 7: Infinite Sessions & Context Compaction
Every LLM has a finite context window, so long chats eventually run out of room. The Copilot SDK fixes this with Infinite Sessions — it automatically compacts old messages so a conversation can run forever.

Getting Started with the GitHub Copilot SDK — Part 6: Asking the User for Input
Part 6 of the GitHub Copilot SDK series. Sometimes the model needs something only the user can give it — a preference, a confirmation, a choice. Here's how the ask_user tool turns a one-way chat into a real back-and-forth.

Getting Started with the GitHub Copilot SDK — Part 5: Permission Request Handling
Part 5 of the GitHub Copilot SDK series. When the model wants to write a file or run a command, the SDK asks you first. This is the OnPermissionRequest handler — your safety gate between the model and the real world.

Getting Started with the GitHub Copilot SDK — Part 4: Pre/Post Tool-Use Hooks
Part 4 of the GitHub Copilot SDK series. Hooks let you sit in the middle of every tool call — log it, allow it, or deny it outright — for auditing, access control, and human-in-the-loop approval.

Getting Started with the GitHub Copilot SDK — Part 3: Custom Tools with AIFunction
Part 3 of the GitHub Copilot SDK series: turn plain C# methods into tools the model can call — simple functions, multiple tools, complex record types, safe error handling, and filtering the built-in tools.