I'm a software architect and hands-on technical lead, and a partner at IdeaBlade. For the past 16 years I've been designing, building and modernizing business-critical applications for clients. Over 25 years in software overall, including leading a 20+ person technology organization.
- What I work in: C# and .NET (ASP.NET Core), TypeScript and Angular, SQL Server and PostgreSQL, Microsoft Azure, CI/CD with GitHub Actions and Azure DevOps.
- Angular from the start: I was part of the IdeaBlade team Google engaged during the Angular 2 beta for enterprise-development feedback; IdeaBlade wrote Angular's original documentation, and we validated it by building real applications on the beta.
- Modernization: moving established .NET Framework, desktop and client-server applications onto modern .NET and Angular, one step at a time, with automated tests in CI.
- AI in business applications: we're proving out AI with clients at IdeaBlade, and I build in public to try ideas and measure what works.
Modernization showcase: TempHire
I wrote IdeaBlade's Punch framework for data-driven XAML apps (Caliburn.Micro + DevForce + Entity Framework). Its TempHire reference app started out in Silverlight and WPF. I've rewritten it, with the help of AI, as a modern line-of-business web app: Angular 22 (standalone, zoneless, signals) with Optimus UI (the open-source fork of PrimeNG), Breeze 3, ASP.NET Core 10 and EF Core 10. Every ported file names the file it came from, and the conversion notes map the old architecture onto the new one, so it doubles as a guide for migrating legacy .NET desktop apps to the web.
It also goes beyond the original. It's multi-tenant: EF Core global query filters, with the tenant carried in the JWT. And it has Quinn, an AI assistant that answers questions about the staffing data. Quinn is built in .NET with Microsoft.Extensions.AI and an MCP server built with the MCP C# SDK, and runs on a local Ollama model or Claude. The agent calls its tools as the signed-in user, so it only ever sees that user's company's data. Its answers stream as the model writes. With the same prompt and tools, Claude used the tools right away, while a small local model (qwen3:4b) needed explicit prompt rules and still missed about one time in four.
AI showcase: rag-example
A step-by-step reference implementation in TypeScript/Node.js, where every change is measured by evals:
- RAG over documents, with cited answers
- Questions over a relational database (text-to-SQL)
- Evals: graded test questions to compare each change
- The database tools as an MCP server
- The tool loop with the Vercel AI SDK
- Sign-in and per-company data isolation
- Hybrid search and re-ranking with LangChain retrievers
One result: re-ranking raised first-place retrieval accuracy from 60% to 88%, while hybrid search didn't beat plain keyword search. The measurements decided what stayed.
I'm part of the IdeaBlade team behind the Breeze data management libraries, BreezeJS for JavaScript/TypeScript and BreezeSharp for .NET, used by companies around the world, including Breeze 3, the ESM rewrite for modern TypeScript released in 2026.



