<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Archiboard</title>
<link>https://archiboard.cortesi.be/</link>
<description>Drawings and notes on building web applications in .NET</description>
<language>en</language>
<atom:link href="https://archiboard.cortesi.be/feed.xml" rel="self" type="application/rss+xml"/>
<item>
<title>Fourteen years of .NET web applications: what changed, what did not</title>
<link>https://archiboard.cortesi.be/craft/fourteen-years-of-dotnet-web-applications/</link>
<guid isPermaLink="true">https://archiboard.cortesi.be/craft/fourteen-years-of-dotnet-web-applications/</guid>
<pubDate>Thu, 20 Aug 2026 09:00:00 GMT</pubDate>
<category>Craft &amp; Judgment</category>
<description>From ASP.NET MVC 2 and Entity Framework 4 to .NET 10. Hosting, configuration, resilience and telemetry became somebody else's problem. Tenancy, migrations, cost, saying no and naming things are still mine.</description>
</item>
<item>
<title>Load testing a tenant-shaped system</title>
<link>https://archiboard.cortesi.be/resilience/load-testing-a-tenant-shaped-system/</link>
<guid isPermaLink="true">https://archiboard.cortesi.be/resilience/load-testing-a-tenant-shaped-system/</guid>
<pubDate>Wed, 12 Aug 2026 09:00:00 GMT</pubDate>
<category>Resilience &amp; Scale</category>
<description>Five hundred identical virtual users prove nothing. Your tenants are three big ones and forty small ones, and only that shape finds the noisy neighbour.</description>
</item>
<item>
<title>The cost sheet: what a tenant actually costs you</title>
<link>https://archiboard.cortesi.be/cloud/the-cost-sheet-what-a-tenant-actually-costs-you/</link>
<guid isPermaLink="true">https://archiboard.cortesi.be/cloud/the-cost-sheet-what-a-tenant-actually-costs-you/</guid>
<pubDate>Thu, 16 Jul 2026 09:00:00 GMT</pubDate>
<category>Cloud &amp; Operations</category>
<description>Cost per tenant is an allocation, not a measurement. The rules of the allocation are a product decision, and finance will treat the first number you give them as the truth.</description>
</item>
<item>
<title>Idempotent consumers and the duplicate message you will receive</title>
<link>https://archiboard.cortesi.be/boundaries/idempotent-consumers-and-the-duplicate-you-will-receive/</link>
<guid isPermaLink="true">https://archiboard.cortesi.be/boundaries/idempotent-consumers-and-the-duplicate-you-will-receive/</guid>
<pubDate>Thu, 11 Jun 2026 09:00:00 GMT</pubDate>
<category>Services &amp; Boundaries</category>
<description>At-least-once means twice, eventually. Make the operation naturally repeatable, or let a unique constraint on an inbox table settle the argument.</description>
</item>
<item>
<title>How I draw a system before I build it</title>
<link>https://archiboard.cortesi.be/craft/how-i-draw-a-system-before-i-build-it/</link>
<guid isPermaLink="true">https://archiboard.cortesi.be/craft/how-i-draw-a-system-before-i-build-it/</guid>
<pubDate>Tue, 02 Jun 2026 09:00:00 GMT</pubDate>
<category>Craft &amp; Judgment</category>
<description>Pen first, then SVG, then code. One drawing per question, a verb on every arrow, and a new sheet rather than an edited one when the system changes.</description>
</item>
<item>
<title>Entra ID multi-tenant applications and the admin consent dance</title>
<link>https://archiboard.cortesi.be/identity/entra-id-multi-tenant-applications-and-the-admin-consent-dance/</link>
<guid isPermaLink="true">https://archiboard.cortesi.be/identity/entra-id-multi-tenant-applications-and-the-admin-consent-dance/</guid>
<pubDate>Thu, 28 May 2026 09:00:00 GMT</pubDate>
<category>Identity &amp; Access</category>
<description>One app registration, any customer directory. The consent flow is well documented. What to trust when the music stops is not.</description>
</item>
<item>
<title>OpenTelemetry in .NET: traces that carry the tenant id</title>
<link>https://archiboard.cortesi.be/cloud/opentelemetry-traces-that-carry-the-tenant-id/</link>
<guid isPermaLink="true">https://archiboard.cortesi.be/cloud/opentelemetry-traces-that-carry-the-tenant-id/</guid>
<pubDate>Thu, 14 May 2026 09:00:00 GMT</pubDate>
<category>Cloud &amp; Operations</category>
<description>A trace without the tenant id is a trace you cannot filter during an incident. Put it in baggage once at the edge, copy it to every span, and make it survive the queue.</description>
</item>
<item>
<title>Background work: hosted services, queues and the job you must not run twice</title>
<link>https://archiboard.cortesi.be/resilience/background-work-and-the-job-you-must-not-run-twice/</link>
<guid isPermaLink="true">https://archiboard.cortesi.be/resilience/background-work-and-the-job-you-must-not-run-twice/</guid>
<pubDate>Thu, 23 Apr 2026 09:00:00 GMT</pubDate>
<category>Resilience &amp; Scale</category>
<description>A BackgroundService with a timer is correct on one instance and wrong on two. The second instance is not a bug you can test for locally.</description>
</item>
<item>
<title>Onboarding a tenant is a saga</title>
<link>https://archiboard.cortesi.be/tenancy/onboarding-a-tenant-is-a-saga/</link>
<guid isPermaLink="true">https://archiboard.cortesi.be/tenancy/onboarding-a-tenant-is-a-saga/</guid>
<pubDate>Tue, 07 Apr 2026 09:00:00 GMT</pubDate>
<category>Tenancy &amp; Data</category>
<description>Six steps across five systems that share no transaction. Treat it as a saga with compensations, make every step idempotent, and send the mail last.</description>
</item>
<item>
<title>The transactional outbox with EF Core and Azure Service Bus</title>
<link>https://archiboard.cortesi.be/boundaries/the-transactional-outbox-with-ef-core-and-service-bus/</link>
<guid isPermaLink="true">https://archiboard.cortesi.be/boundaries/the-transactional-outbox-with-ef-core-and-service-bus/</guid>
<pubDate>Thu, 05 Mar 2026 09:00:00 GMT</pubDate>
<category>Services &amp; Boundaries</category>
<description>You cannot commit a row and publish a message in one transaction. Write the message to a table instead and let a relay carry it to the bus.</description>
</item>
<item>
<title>Authorization policies, requirements and handlers: roles that belong to a tenant</title>
<link>https://archiboard.cortesi.be/identity/authorization-policies-requirements-and-handlers-roles-that-belong-to-a-tenant/</link>
<guid isPermaLink="true">https://archiboard.cortesi.be/identity/authorization-policies-requirements-and-handlers-roles-that-belong-to-a-tenant/</guid>
<pubDate>Tue, 24 Feb 2026 09:00:00 GMT</pubDate>
<category>Identity &amp; Access</category>
<description>A role claim without a tenant next to it is a global role, and a global role in a multi-tenant product is a bug waiting for the second tenant.</description>
</item>
<item>
<title>Saying no to the feature that breaks the tenancy model</title>
<link>https://archiboard.cortesi.be/craft/saying-no-to-the-feature-that-breaks-the-tenancy-model/</link>
<guid isPermaLink="true">https://archiboard.cortesi.be/craft/saying-no-to-the-feature-that-breaks-the-tenancy-model/</guid>
<pubDate>Thu, 19 Feb 2026 09:00:00 GMT</pubDate>
<category>Craft &amp; Judgment</category>
<description>A report across sister companies, a user shared between tenants. Each sounds small, and each turns the tenant boundary into a suggestion. Say no with a drawing, and bring the alternative on the same sheet.</description>
</item>
<item>
<title>App Service, Container Apps or AKS: hosting a .NET web application then and now</title>
<link>https://archiboard.cortesi.be/cloud/app-service-container-apps-or-aks/</link>
<guid isPermaLink="true">https://archiboard.cortesi.be/cloud/app-service-container-apps-or-aks/</guid>
<pubDate>Tue, 10 Feb 2026 09:00:00 GMT</pubDate>
<category>Cloud &amp; Operations</category>
<description>In 2014 the choice was a Cloud Services role, the new Azure Websites, or a virtual machine you patched yourself. Container Apps eventually put a rung in the middle of the ladder, and that is where most small teams should stand.</description>
</item>
<item>
<title>Caching layers for a web application: in-process, Redis, and HybridCache</title>
<link>https://archiboard.cortesi.be/resilience/caching-layers-for-a-web-application/</link>
<guid isPermaLink="true">https://archiboard.cortesi.be/resilience/caching-layers-for-a-web-application/</guid>
<pubDate>Tue, 27 Jan 2026 09:00:00 GMT</pubDate>
<category>Resilience &amp; Scale</category>
<description>Two layers, one key format. If the tenant id is not in the key, the cache is a data leak with good response times.</description>
</item>
<item>
<title>EF Core global query filters as a tenant fence, and where they leak</title>
<link>https://archiboard.cortesi.be/tenancy/ef-core-query-filters-as-a-tenant-fence/</link>
<guid isPermaLink="true">https://archiboard.cortesi.be/tenancy/ef-core-query-filters-as-a-tenant-fence/</guid>
<pubDate>Mon, 19 Jan 2026 09:00:00 GMT</pubDate>
<category>Tenancy &amp; Data</category>
<description>HasQueryFilter is the best default a shared-row database can have. It is not a security boundary, and there are three doors around it.</description>
</item>
<item>
<title>CQRS without the ceremony</title>
<link>https://archiboard.cortesi.be/boundaries/cqrs-without-the-ceremony/</link>
<guid isPermaLink="true">https://archiboard.cortesi.be/boundaries/cqrs-without-the-ceremony/</guid>
<pubDate>Thu, 18 Dec 2025 09:00:00 GMT</pubDate>
<category>Services &amp; Boundaries</category>
<description>Two models, one database, no mediator. Separate the shapes you write from the shapes you read and stop there until something forces you further.</description>
</item>
<item>
<title>Rate limiting the noisy neighbour</title>
<link>https://archiboard.cortesi.be/resilience/rate-limiting-the-noisy-neighbour/</link>
<guid isPermaLink="true">https://archiboard.cortesi.be/resilience/rate-limiting-the-noisy-neighbour/</guid>
<pubDate>Thu, 04 Dec 2025 09:00:00 GMT</pubDate>
<category>Resilience &amp; Scale</category>
<description>The limit is not there to protect the API. It is there to protect the database that every other tenant is also using.</description>
</item>
<item>
<title>Feature flags with Azure App Configuration: ship dark, reveal per tenant</title>
<link>https://archiboard.cortesi.be/cloud/feature-flags-ship-dark-reveal-per-tenant/</link>
<guid isPermaLink="true">https://archiboard.cortesi.be/cloud/feature-flags-ship-dark-reveal-per-tenant/</guid>
<pubDate>Thu, 20 Nov 2025 09:00:00 GMT</pubDate>
<category>Cloud &amp; Operations</category>
<description>A flag is a switch you intend to remove. An entitlement is a promise you intend to keep. Mixing them is how a pricing rule ends up in a config store.</description>
</item>
<item>
<title>OpenID Connect for a multi-tenant web application: one issuer, many tenants</title>
<link>https://archiboard.cortesi.be/identity/openid-connect-one-issuer-many-tenants/</link>
<guid isPermaLink="true">https://archiboard.cortesi.be/identity/openid-connect-one-issuer-many-tenants/</guid>
<pubDate>Thu, 13 Nov 2025 09:00:00 GMT</pubDate>
<category>Identity &amp; Access</category>
<description>Every tenant wants to bring its own identity provider. The OIDC handler was designed for one. Here is how to make them agree without lying to the framework.</description>
</item>
<item>
<title>Versioning a public API for a thousand tenants</title>
<link>https://archiboard.cortesi.be/boundaries/versioning-a-public-api-for-a-thousand-tenants/</link>
<guid isPermaLink="true">https://archiboard.cortesi.be/boundaries/versioning-a-public-api-for-a-thousand-tenants/</guid>
<pubDate>Thu, 30 Oct 2025 09:00:00 GMT</pubDate>
<category>Services &amp; Boundaries</category>
<description>The version is a promise to people you will never meet. Put it in the URL, keep changes additive, and treat a sunset date as a project rather than a header.</description>
</item>
<item>
<title>Reading Microsoft docs like an architect</title>
<link>https://archiboard.cortesi.be/craft/reading-microsoft-docs-like-an-architect/</link>
<guid isPermaLink="true">https://archiboard.cortesi.be/craft/reading-microsoft-docs-like-an-architect/</guid>
<pubDate>Tue, 14 Oct 2025 09:00:00 GMT</pubDate>
<category>Craft &amp; Judgment</category>
<description>The Architecture Center, the product docs and the Well-Architected Framework answer three different questions. Read the limits page first, check the date, and go to the samples repo when the words stop making sense.</description>
</item>
<item>
<title>Three ways to slice a tenant</title>
<link>https://archiboard.cortesi.be/tenancy/three-ways-to-slice-a-tenant/</link>
<guid isPermaLink="true">https://archiboard.cortesi.be/tenancy/three-ways-to-slice-a-tenant/</guid>
<pubDate>Thu, 02 Oct 2025 09:00:00 GMT</pubDate>
<category>Tenancy &amp; Data</category>
<description>Database, schema or row. The choice you make in month one is the one you live with in year six.</description>
</item>
<item>
<title>Per-tenant configuration and entitlements</title>
<link>https://archiboard.cortesi.be/tenancy/per-tenant-configuration-and-entitlements/</link>
<guid isPermaLink="true">https://archiboard.cortesi.be/tenancy/per-tenant-configuration-and-entitlements/</guid>
<pubDate>Tue, 23 Sep 2025 09:00:00 GMT</pubDate>
<category>Tenancy &amp; Data</category>
<description>A feature flag says whether the code path is switched on. An entitlement says whether this tenant paid for it. Confuse the two and support will confuse them for you.</description>
</item>
<item>
<title>Deployment stamps: cloning the whole cell</title>
<link>https://archiboard.cortesi.be/cloud/deployment-stamps-cloning-the-whole-cell/</link>
<guid isPermaLink="true">https://archiboard.cortesi.be/cloud/deployment-stamps-cloning-the-whole-cell/</guid>
<pubDate>Thu, 04 Sep 2025 09:00:00 GMT</pubDate>
<category>Cloud &amp; Operations</category>
<description>A stamp is a unit of scale and a unit of blast radius. The second property is the one that pays for the first.</description>
</item>
<item>
<title>Bicep and the environments ladder</title>
<link>https://archiboard.cortesi.be/cloud/bicep-and-the-environments-ladder/</link>
<guid isPermaLink="true">https://archiboard.cortesi.be/cloud/bicep-and-the-environments-ladder/</guid>
<pubDate>Thu, 28 Aug 2025 09:00:00 GMT</pubDate>
<category>Cloud &amp; Operations</category>
<description>One module, four parameter files, and a what-if that a human actually reads. Everything else is how environments drift apart.</description>
</item>
<item>
<title>API keys, client credentials and machine access</title>
<link>https://archiboard.cortesi.be/identity/api-keys-client-credentials-and-machine-access/</link>
<guid isPermaLink="true">https://archiboard.cortesi.be/identity/api-keys-client-credentials-and-machine-access/</guid>
<pubDate>Tue, 19 Aug 2025 09:00:00 GMT</pubDate>
<category>Identity &amp; Access</category>
<description>Customers integrate with a cron script long before they integrate with your SDK. Give the script a key, give the platform a token, and never store either in the clear.</description>
</item>
<item>
<title>Bounded contexts before microservices: drawing the seams</title>
<link>https://archiboard.cortesi.be/boundaries/bounded-contexts-before-microservices/</link>
<guid isPermaLink="true">https://archiboard.cortesi.be/boundaries/bounded-contexts-before-microservices/</guid>
<pubDate>Wed, 09 Jul 2025 09:00:00 GMT</pubDate>
<category>Services &amp; Boundaries</category>
<description>Find the seams with language, rate of change and team shape. Draw the context map first, and only then decide what deploys separately.</description>
</item>
<item>
<title>Retries, timeouts and the circuit breaker: Polly then, Microsoft.Extensions.Resilience now</title>
<link>https://archiboard.cortesi.be/resilience/retries-timeouts-and-the-circuit-breaker/</link>
<guid isPermaLink="true">https://archiboard.cortesi.be/resilience/retries-timeouts-and-the-circuit-breaker/</guid>
<pubDate>Thu, 26 Jun 2025 09:00:00 GMT</pubDate>
<category>Resilience &amp; Scale</category>
<description>Three retries and a two second wait is not a resilience strategy. It is a load generator with good intentions.</description>
</item>
<item>
<title>Sharding Azure SQL with elastic pools and a catalog</title>
<link>https://archiboard.cortesi.be/tenancy/sharding-azure-sql-with-elastic-pools-and-a-catalog/</link>
<guid isPermaLink="true">https://archiboard.cortesi.be/tenancy/sharding-azure-sql-with-elastic-pools-and-a-catalog/</guid>
<pubDate>Tue, 17 Jun 2025 09:00:00 GMT</pubDate>
<category>Tenancy &amp; Data</category>
<description>A shard is a database, a pool is a budget, and the catalog is the only thing that knows which is which. Keep it small enough to understand at three in the morning.</description>
</item>
<item>
<title>ASP.NET Core Identity or Azure AD B2C: choosing the front door</title>
<link>https://archiboard.cortesi.be/identity/aspnet-core-identity-or-azure-ad-b2c-choosing-the-front-door/</link>
<guid isPermaLink="true">https://archiboard.cortesi.be/identity/aspnet-core-identity-or-azure-ad-b2c-choosing-the-front-door/</guid>
<pubDate>Tue, 06 May 2025 09:00:00 GMT</pubDate>
<category>Identity &amp; Access</category>
<description>Own the password table or rent the login page. Both are fine choices; what is not fine is owning it by accident.</description>
</item>
</channel>
</rss>
