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 5 - December 11, 2025

What I Worked On

Forty hours went into one thing this week: billing. If DevNitro is going to charge for itself, it needs a real subscription system, not a Stripe button bolted on the side. So I built the backbone: the domain for plans, sessions, projects, and workspaces, the SQL behind it, the stores, the services, and the APIs on top.

The piece I care most about is Stripe webhook handling. When Stripe tells you a payment succeeded or a subscription changed, you have to catch that event, store it, and never process it twice. I built webhook event handling with persistence, an event store keyed by Stripe's event id, and moved the payment webhook into GCT so every generated site inherits billing instead of reimplementing it.

A smaller thread: I got remote tool calls working against Docker without going through MCP, and sketched an agent and sub-agent nesting design.

What the AI Did Well

The webhook and store work is well-shaped: clear inputs, clear persistence, a clear idempotency rule. I had the AI build the event store methods (get-by-event-id, create) and the webhook handler, and write the tests around them. I also hardened the AES encrypt and decrypt helpers to work on byte arrays instead of strings, which is the correct way to handle that and an easy place to be subtly wrong.

What Needed Correction

Deploying is still the rough edge. I pushed a release and the site came up, but the database did not upgrade. The schema comparison was timing out while talking to the production database, so the migration silently did nothing. I raised the DacFx timeout, improved the error handling and logging so a timeout stops being invisible, and tuned the database connection pool settings in production. A migration that fails quietly is worse than one that fails loud.

What Shipped

DevNitro has a subscription and session domain, backed by SQL, stores, services, and APIs. Stripe webhook events are handled and persisted with idempotency, and the payment webhook lives in GCT so generated sites get billing for free. AES encryption in the shared helpers is byte-array based. The deploy path surfaces migration timeouts instead of hiding them. And the first real person signed up for the waitlist this week, which made the billing work feel less theoretical.

The Numbers

Category Hours
Product / Features 46h 36m
Content 4h 38m
Community 1h 18m
Total 52h 32m

The most focused week in a while. Forty of the fifty-two hours were subscriptions, with a few on the tool-calling architecture and the usual content slice.


Stripe billing is easy to demo and hard to trust. Handling the webhook you did not expect, and the migration that timed out on the way to production, is what decides whether the money actually shows up.

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.