From Channels to Wolverine: Upgrade Without a Rewrite
Prototype with Channel
Prototype with Channel
W3C Web Push lets the browser ring even when your tab is closed. With VAPID you do it without FCM, without APNs, and without a single US-hosted dependency. Here is the .NET 10 side, the React hook, and the 30 lines of service worker that ties them together.
Every line-of-business app eventually grows an “import CSV” button. Done wrong it OOMs on the first 100k row file. Done right it streams, validates, resolves identity, and hands the user a correction file for the rows that failed.
Stop sprinkling CreatedAt assignments across repositories and IsDeleted = false across queries. Five interceptors and one global filter make compliance the default — and ExecuteUpdate the only thing left to watch for.
Hangfire ships fast. Then production scales out, two nodes fire the same recurring job at the same time, the outbox you bolted on doesn’t include the job table, and the audit log goes sideways. There is a better default in 2026.
LaunchDarkly is great. €0.0050 per MAU is less great when you have 200k tenants and want to gate “VideoConference” behind the Premium plan. Here is how to build LaunchDarkly’s core value in your own .NET codebase — without the bill.
Every SaaS eventually needs invoices, contracts, monthly reports. The HTML-to-PDF route is cheaper, more flexible and easier to maintain than iText or QuestPDF — provided you build the pipeline right. Here’s how.
Code reviews catch typos. They do not catch a controller quietly importing Microsoft.EntityFrameworkCore and bypassing your repository layer. Architecture tests do — at build time, on every PR. Here is a pragmatic playbook for .NET teams.
Wire Keycloak JWT Bearer authentication into a Granit API in five minutes — claims transformation, role mapping, back-channel logout, and an Admin authorization policy, all from one DependsOn.
From accidental client evaluation to N+1 queries and tracked reads, these are the five EF Core anti-patterns that turn 50 ms endpoints into 5-second ones — and the exact fix for each.