Blog
Blog
Notes from practice — regulated software, multi-tenant SaaS architecture, .NET, and real-time systems.
Building an audit trail that survives an audit
The data-model patterns behind a credible audit trail — shadow table, temporal tables or event sourcing — and the trade-offs of each.
C++20 for real-time services: a processing pipeline and WebSocket streaming
What "real-time" actually demands from a C++ service — bounded queues, backpressure, one thread per stage or one executor, and the allocation you did not know you were making.
Database per tenant or shared schema — how to choose
A practical comparison of the two multi-tenant isolation models: what you gain, what you pay, and what changes for migrations, backups and onboarding.
21 CFR Part 11 in practice: audit trails, electronic signatures, data integrity
What the FDA regulation on electronic records and signatures actually requires — and how it translates into architecture decisions rather than paperwork.
Field-level encryption with AES-256-GCM and per-tenant derived keys
How to protect sensitive fields in a multi-tenant SaaS — key derivation, nonces, additional authenticated data, and the hard parts: search and key rotation.
From enterprise to building SaaS on my own: what transfers and what does not
Ten years on enterprise and healthcare systems, then a year building products alone. An honest inventory of which habits helped, which were dead weight, and which actively got in the way.
IDOR-safe RBAC: why checking the role is not enough
A role says what you may do, not what you may do it to. The most common data leaks in a SaaS live in the gap between those two questions.
IEC 62304 for developers: what it actually means in code
The standard governing medical device software, explained from the perspective of an engineer who has shipped under it — safety classification, traceability, SOUP, and what genuinely changes in day-to-day work.
What I learned leading an engineering team at Oracle
Four years leading a distributed team on clinical systems — what actually changed, what I got wrong first, and which habits survived the move.
Modernizing legacy C++ without losing compliance
Refactoring old code in a regulated product is not blocked by the standard — it is blocked by traceability. The strategy that works: small, isolated changes with a clear equivalence argument.
Multi-tenant data isolation with EF Core global query filters
How to build per-tenant isolation without repeating WHERE TenantId in every query — and the gaps that still leak data.
Rate limiting a temperamental external API: Polly + SemaphoreSlim
How to stay inside someone else’s rate limits without stalling your own pipeline — client-side throttling, retry ordering, Retry-After, and the multi-instance trap.
Tolerant JSON contracts: surviving an inconsistent API
When the provider sends a number as a string, an object where an array was documented, and an empty string for a date — how to absorb the shape without absorbing the ambiguity.
What I learned shipping software under GxP
The years spent on medical and laboratory systems changed me as an engineer — not through procedures, but through a few habits I carried into everything I build.