# Software Architecture · Tech watch

[Canonical source](<https://sebastien.rigaux.be/en/tech-watch/tags/software-architecture>)

Organizing components, dependencies and responsibilities within software systems.

## [.NET multi-tenancy: move a tenant without downtime — part 4/4](<https://sebastien.rigaux.be/en/tech-watch/links/net-multi-tenancy-move-a-tenant-without-downtime-part-44>)

This installment explains how to move a tenant from a shared database to a dedicated one without taking the application offline or disrupting other tenants. The catalog drives the switch, while the same EF Core model and query filter serve both isolation modes.

The migration uses an initial copy, a temporary read-only window, a delta copy, and verification before cutover. The runbook waits for the cache to expire before reopening writes, preventing instances that still hold the old connection from writing to the shared database after the switch.

2026-11-02 · [Markdown](<https://sebastien.rigaux.be/en/tech-watch/links/net-multi-tenancy-move-a-tenant-without-downtime-part-44.md>) · [Original resource](<https://barretblake.dev/posts/development/2026/08/multi-tenant-moving-day/>)

## [.NET multi-tenancy: one database per tenant — Part 3/4](<https://sebastien.rigaux.be/en/tech-watch/links/net-multi-tenancy-one-database-per-tenant-part-34>)

With one database per tenant, EF Core no longer needs a global query filter, a `TenantId` column, or a tenant-specific model cache key: the tenant is selected through a connection string resolved from a catalog database.

This isolation simplifies the model but shifts complexity to operations: each migration must be applied to every database. The article also explains how `IDesignTimeDbContextFactory` lets `dotnet ef` create the context without an active request or tenant.

2026-11-02 · [Markdown](<https://sebastien.rigaux.be/en/tech-watch/links/net-multi-tenancy-one-database-per-tenant-part-34.md>) · [Original resource](<https://barretblake.dev/posts/development/2026/08/multi-tenant-part-3/>)

## [.NET multi-tenancy: isolate data by SQL Server schema — part 2/4](<https://sebastien.rigaux.be/en/tech-watch/links/net-multi-tenancy-isolate-data-by-sql-server-schema-part-24>)

Part 2/4 shows how to isolate each tenant’s data in its own SQL Server schema, without a global query filter or a required `TenantId` column. EF Core can use a simple primary key again, while the database structure itself enforces the isolation boundary.

The key change is model caching: `OnModelCreating` runs only once per model. The schema must be included in the cache key through `IModelCacheKeyFactory`, or EF Core may reuse the first tenant’s schema. The article also covers per-schema provisioning and migrations, plus strict validation of schema names interpolated into SQL.

2026-11-02 · [Markdown](<https://sebastien.rigaux.be/en/tech-watch/links/net-multi-tenancy-isolate-data-by-sql-server-schema-part-24.md>) · [Original resource](<https://barretblake.dev/posts/development/2026/07/multi-tenant-part-2/>)

## [.NET range types as first-class domain objects](<https://sebastien.rigaux.be/en/tech-watch/links/net-range-types-as-first-class-domain-objects>)

CodoMetis.ValueRanges offers .NET range types to replace pairs of dates and their scattered logic. Its five variants—finite, unbounded on either side, infinite, and empty—make possible shapes and rules explicit, while operations such as `Contains` and `Overlaps` run in memory.

The companion EF Core package bridges the domain model to PostgreSQL: the same operations are translated into SQL operators through Npgsql. The article also explains the design trade-off: abstract records rather than structs, so each variant can be represented by a type hierarchy.

2026-11-01 · [Markdown](<https://sebastien.rigaux.be/en/tech-watch/links/net-range-types-as-first-class-domain-objects.md>) · [Original resource](<https://dev.to/caffeinatedcoder/the-interval-is-the-thing-modelling-range-types-as-first-class-domain-objects-in-net-3jha>)

## [Metalama generates C\# patterns and enforces architecture at build time](<https://sebastien.rigaux.be/en/tech-watch/links/metalama-generates-c-patterns-and-enforces-architecture-at-build-time>)

Metalama automates cross-cutting C# patterns with aspects that generate code at compile time, while checking architecture rules as you edit. The repetitive implementation stays out of business code and the repository, and one aspect can be applied to a method or to a set of methods selected in code.

For example, an aspect can wrap a method in `try/catch` to log its entry, result, and exceptions. Metalama also lets you preview and debug the transformed code, making those changes inspectable.

2026-10-30 · [Markdown](<https://sebastien.rigaux.be/en/tech-watch/links/metalama-generates-c-patterns-and-enforces-architecture-at-build-time.md>) · [Original resource](<https://postsharp.net/metalama>)

## [REA: agent-powered reverse engineering for binaries and applications](<https://sebastien.rigaux.be/en/tech-watch/links/rea-agent-powered-reverse-engineering-for-binaries-and-applications>)

REA offers a unified approach to reverse engineering, driven by agents that can analyze native binaries, JavaScript/Electron apps, websites, or databases without source code access. The tool integrates with agents like Claude Code or Cursor, provides evidence and limitations for each analysis, and leverages native tools (Hopper, Ghidra, IDA) for deep inspection. The documentation details supported scenarios, provider setup, and CLI workflows, with concrete examples of feature-level reverse engineering from real applications.

2026-10-19 · [Markdown](<https://sebastien.rigaux.be/en/tech-watch/links/rea-agent-powered-reverse-engineering-for-binaries-and-applications.md>) · [Original resource](<https://github.com/morluto/rea>)

## [React project structure: from single file to modular monorepo](<https://sebastien.rigaux.be/en/tech-watch/links/react-project-structure-from-single-file-to-modular-monorepo>)

This comprehensive overview walks through organizing a React project, from a single file to a modular monorepo structure. The author details how to split code (files, technical folders, feature folders, domains, packages) and the impact of each approach on maintainability, dependency isolation, and scalability. Concrete examples illustrate how to evolve the architecture as the project grows, with clear rules to prevent cross-feature dependencies and encourage reuse.

2026-10-19 · [Markdown](<https://sebastien.rigaux.be/en/tech-watch/links/react-project-structure-from-single-file-to-modular-monorepo.md>) · [Original resource](<https://www.robinwieruch.de/react-folder-structure/>)

## [Learn JavaScript and web performance patterns with Patterns.dev](<https://sebastien.rigaux.be/en/tech-watch/links/learn-javascript-and-web-performance-patterns-with-patterns-dev>)

Patterns.dev documents JavaScript design patterns and performance techniques for web apps. Its examples connect architectural choices to their impact on loading and rendering.

2026-05-10 · [Markdown](<https://sebastien.rigaux.be/en/tech-watch/links/learn-javascript-and-web-performance-patterns-with-patterns-dev.md>) · [Original resource](<https://www.patterns.dev/>)

## [Explore generated repository docs with Code Wiki](<https://sebastien.rigaux.be/en/tech-watch/links/explore-generated-repository-docs-with-code-wiki>)

Code Wiki generates explanations, API references, and architecture views from public repositories. Its code-section navigation helps explore a project without manually reading every file.

2026-02-14 · [Markdown](<https://sebastien.rigaux.be/en/tech-watch/links/explore-generated-repository-docs-with-code-wiki.md>) · [Original resource](<https://codewiki.google/>)

## [Nakama: a backend for multiplayer games and social features](<https://sebastien.rigaux.be/en/tech-watch/links/nakama-a-backend-for-multiplayer-games-and-social-features>)

Nakama combines user accounts, storage, chat, leaderboards and multiplayer modes. The server provides shared foundations for games and real-time applications.

2026-01-23 · [Markdown](<https://sebastien.rigaux.be/en/tech-watch/links/nakama-a-backend-for-multiplayer-games-and-social-features.md>) · [Original resource](<https://github.com/heroiclabs/nakama>)

## [The challenges of self-hosting Next.js across replicas](<https://sebastien.rigaux.be/en/tech-watch/links/the-challenges-of-self-hosting-next-js-across-replicas>)

This experience report examines the challenges of horizontally deployed Next.js. It highlights caching and coordination concerns when multiple instances serve the same application.

2025-09-07 · [Markdown](<https://sebastien.rigaux.be/en/tech-watch/links/the-challenges-of-self-hosting-next-js-across-replicas.md>) · [Original resource](<https://www.dlhck.com/essays/the-complete-guide-to-self-hosting-nextjs-at-scale>)

## [Next-forge: start a SaaS with a structured monorepo](<https://sebastien.rigaux.be/en/tech-watch/links/next-forge-start-a-saas-with-a-structured-monorepo>)

Next-forge provides a Turborepo template separating the application, API, emails, website and documentation. The structure lays foundations for a Next.js product with multiple surfaces.

2025-08-16 · [Markdown](<https://sebastien.rigaux.be/en/tech-watch/links/next-forge-start-a-saas-with-a-structured-monorepo.md>) · [Original resource](<https://www.next-forge.com/>)

## [DivKit: describe cross-platform interfaces from the server](<https://sebastien.rigaux.be/en/tech-watch/links/divkit-describe-cross-platform-interfaces-from-the-server>)

DivKit describes elements, states and animations in data sent to the client. Native Android, iOS and web renderers support interface changes without a separate app release for each update.

2025-08-08 · [Markdown](<https://sebastien.rigaux.be/en/tech-watch/links/divkit-describe-cross-platform-interfaces-from-the-server.md>) · [Original resource](<https://divkit.tech/en/>)

## [Vogen: generate value objects around .NET types](<https://sebastien.rigaux.be/en/tech-watch/links/vogen-generate-value-objects-around-net-types>)

Vogen wraps primitives in generated domain types. Its CustomerId example shows how to obtain comparisons and controlled construction without writing repetitive boilerplate.

2025-02-09 · [Markdown](<https://sebastien.rigaux.be/en/tech-watch/links/vogen-generate-value-objects-around-net-types.md>) · [Original resource](<https://stevedunn.github.io/Vogen/overview.html>)

## [Eraser: create diagrams from text or code](<https://sebastien.rigaux.be/en/tech-watch/links/eraser-create-diagrams-from-text-or-code>)

Eraser accepts descriptions, files and code to build diagrams. Inputs such as Terraform or design documents help turn architecture into visuals teams can discuss.

2025-01-06 · [Markdown](<https://sebastien.rigaux.be/en/tech-watch/links/eraser-create-diagrams-from-text-or-code.md>) · [Original resource](<https://www.eraser.io/>)

## [Applying Gall’s law to complex software projects](<https://sebastien.rigaux.be/en/tech-watch/links/applying-gall-s-law-to-complex-software-projects>)

Jennifer Pahlka revisits healthcare.gov to argue for growing from a simple working system. The piece connects large-project risks to attempting to deliver all complexity at once.

2023-10-07 · [Markdown](<https://sebastien.rigaux.be/en/tech-watch/links/applying-gall-s-law-to-complex-software-projects.md>) · [Original resource](<https://bigthink.com/smart-skills/complex-project-galls-law/>)

## [Generate .NET builders that guide object construction](<https://sebastien.rigaux.be/en/tech-watch/links/generate-net-builders-that-guide-object-construction>)

This generator creates builders for classes, structs and records. Its steps require mandatory information before optional values while encouraging immutable objects.

2023-08-27 · [Markdown](<https://sebastien.rigaux.be/en/tech-watch/links/generate-net-builders-that-guide-object-construction.md>) · [Original resource](<https://github.com/bnayae/Bnaya.BuilderPatternGenerator>)

## [Frappe: a metadata-driven framework for business applications](<https://sebastien.rigaux.be/en/tech-watch/links/frappe-a-metadata-driven-framework-for-business-applications>)

Frappe combines a Python backend with a JavaScript interface for business applications. Its metadata model, used by ERPNext, defines objects and behavior to reduce repetitive application code.

2023-05-06 · [Markdown](<https://sebastien.rigaux.be/en/tech-watch/links/frappe-a-metadata-driven-framework-for-business-applications.md>) · [Original resource](<https://github.com/frappe/frappe>)

## [Applying SOLID principles to Vue 3 components](<https://sebastien.rigaux.be/en/tech-watch/links/applying-solid-principles-to-vue-3-components>)

The article applies SOLID principles to frontend development with Vue 3. It connects general design rules to maintainable application code beyond framework-specific mechanics.

2023-05-06 · [Markdown](<https://sebastien.rigaux.be/en/tech-watch/links/applying-solid-principles-to-vue-3-components.md>) · [Original resource](<https://medium.com/@moein.mirkiani/solid-principles-in-vue-29ecc988f968>)

## [Model application security flows during architecture design](<https://sebastien.rigaux.be/en/tech-watch/links/model-application-security-flows-during-architecture-design>)

Damien Bod proposes security context models centered on authentication and authorization flows. The diagrams help identify trust boundaries and design mistakes before implementation.

2023-05-02 · [Markdown](<https://sebastien.rigaux.be/en/tech-watch/links/model-application-security-flows-during-architecture-design.md>) · [Original resource](<https://damienbod.com/2023/05/01/application-security-context-models/>)

Page 1 / 2

[Next](<https://sebastien.rigaux.be/en/tech-watch/tags/software-architecture/page/2>)
