A note about this build log entry: I published this after the week it covers. DevNitro reconstructed a draft from work-related entries in my journal, Git commit history, and time tracking. I reviewed, edited, and approved the final post. The story reflects what I knew and built at the time.

From the Backlog to the Build Log

Week of December 12 - December 18, 2025

What I Worked On

The big bet this week was provider independence: letting a developer point DevNitro at their own AI subscription instead of forcing them onto mine. If you already pay for Claude Max or an OpenAI Codex plan, DevNitro should use it.

That meant getting DevNitro's CLI to drive AI agent tool calls through each provider. Claude Code through the Claude Agent SDK, and OpenAI through its own OAuth and endpoints. They are not the same shape. I did not realize until I was in it that they use different endpoints and different auth, so half the work was building an abstraction that hides that difference from the rest of the app. By the end of the week, tool calling worked through Codex cleanly and through Claude Code, slower but functional.

I also refactored the Visual Studio extension to drop its .NET Framework 4.8 dependency and move to .NET 8, and swapped the old Claude Agent SDK for the C# SDK so the extension and the CLI share one code path.

What the AI Did Well

Porting the autonomous coding agent to C# and wiring up the agent runner, so a user can kick off a sub-agent like the xUnit test agent, went well once the provider abstraction was in place. I had it work three issues around tool calling and agent invocation in a row, and the write-a-test-then-make-it-pass loop kept it honest.

What Needed Correction

The security lockdown from two weeks ago bit me. I had set the API to deny anonymous access by default, which is correct, except one endpoint genuinely needed to be reachable without a login. So instead of returning JSON, it redirected to the HTML login page, and the callers silently failed. I found it by digging into a poison-message queue full of stuck requests. The fix was to allow anonymous access on that one endpoint and redeploy. Default-deny is right. It also means you have to remember which doors are supposed to stay open.

I also spent a few hours on a decision, not code. I got obfuscation working in GCT and then backed it out. It barely obfuscated anything and it would add friction for enterprise customers running DevNitro in their own environment. I went with licensing instead, which protects the work without getting in the customer's way.

What Shipped

DevNitro drives tool calls through both Claude Code and OpenAI Codex using the developer's own subscription. The agent runner can launch sub-agents. The VS extension runs on .NET 8 with the C# SDK instead of .NET Framework 4.8 and TypeScript. GCT got a data-layer extension-method design and API key auth, a legacy compatibility layer for the pre-2.0 migration path, and multi-targeting so the Domain and SharedKernel build for both .NET 8 and .NET 10.

The Numbers

Category Hours
Product / Features 46h 35m
Content 3h 44m
Community 1h 3m
Total 51h 21m

Almost the whole week was tool calling and the VS extension refactor, with a few hours each on agents and licensing.


Letting developers bring their own AI subscription sounds simple and turns into two providers, two auth flows, and two endpoints pretending to be one. It is also what lets a team keep the AI relationship they already have, instead of renting mine.

Curious how this site was built?
Watch the 5-minute walkthrough at devnitro.com →

An AI built this blog (but not this post)

This entire blog system (domain models, database, services, UI, auth, etc.) was built by DevNitro on its own in 95 minutes. I recorded every second.

    We respect your privacy. Unsubscribe at any time.