# Tech watch

[Canonical source](<https://sebastien.rigaux.be/en/tech-watch/page/2>)

## [.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 multi-tenancy: query isolation and SQL Server partitions — part 1/4](<https://sebastien.rigaux.be/en/tech-watch/links/net-multi-tenancy-query-isolation-and-sql-server-partitions-part-14>)

This first installment presents a shared-schema .NET multi-tenant design: EF Core filters reads by tenant, while SQL Server physically partitions rows to speed up data access. The key distinction is that partitioning is not a security boundary; isolation relies on the EF Core global query filter.

The article also explains resolving the tenant per request, assigning its ID to new rows, and adding partitions to migrations with raw SQL. The primary key must include `GuildId`, a constraint SQL Server imposes when partitioning a unique index.

2026-11-02 · [Markdown](<https://sebastien.rigaux.be/en/tech-watch/links/net-multi-tenancy-query-isolation-and-sql-server-partitions-part-14.md>) · [Original resource](<https://barretblake.dev/posts/development/2026/07/multi-tenant-part-1/>)

## [Agent loops in C\# with Microsoft Agent Framework](<https://sebastien.rigaux.be/en/tech-watch/links/agent-loops-in-c-with-microsoft-agent-framework>)

Agent loops combine action, observation, and evaluation to refine an answer or retry an operation until it meets a criterion. Jesse Liberty demonstrates the pattern in C# with Microsoft Agent Framework: a loop agent, an evaluator, and an iteration limit.

The example contrasts a deterministic marker such as `DONE` with a model-based judge, then outlines safeguards to add: timeouts, idempotent calls, logging, and cost tracking. Each iteration adds latency and token usage.

2026-11-02 · [Markdown](<https://sebastien.rigaux.be/en/tech-watch/links/agent-loops-in-c-with-microsoft-agent-framework.md>) · [Original resource](<https://jesseliberty.com/2026/10/26/prompts-are-dead-long-live-loops/>)

## [Elephant-Goldfish Model: Google’s skills for shaping specs](<https://sebastien.rigaux.be/en/tech-watch/links/elephant-goldfish-model-googles-skills-for-shaping-specs>)

Elephant-Goldfish Model, Google’s open-source plugin, provides **skills** to explore an idea, draft a specification, and challenge it before implementation. An “Elephant” agent keeps the project context; “Goldfish” reviewers inspect the document without the conversation history to surface unstated assumptions and risks.

The repository also covers resolving review findings and comparing documentation with code. Reviews require fresh subagent contexts; if the environment cannot create them, EGM stops that step.

2026-11-01 · [Markdown](<https://sebastien.rigaux.be/en/tech-watch/links/elephant-goldfish-model-googles-skills-for-shaping-specs.md>) · [Original resource](<https://github.com/google/elephant-goldfish-model>)

## [Web accessibility: Laura Kalbag’s book is free to read online](<https://sebastien.rigaux.be/en/tech-watch/links/web-accessibility-laura-kalbags-book-is-free-to-read-online>)

Laura Kalbag has made *Accessibility for Everyone* free to read on the web. First published by A Book Apart in 2017, the book is now available to the web community as a resource for learning about accessibility.

Kalbag notes that accessibility best practices have changed little, while some recommended tools and job titles may be outdated; the Web Content Accessibility Guidelines are also approaching version 3.

2026-11-01 · [Markdown](<https://sebastien.rigaux.be/en/tech-watch/links/web-accessibility-laura-kalbags-book-is-free-to-read-online.md>) · [Original resource](<https://accessibilityforeveryone.site/>)

## [Modern Web Guidance brings current web practices to coding agents](<https://sebastien.rigaux.be/en/tech-watch/links/modern-web-guidance-brings-current-web-practices-to-coding-agents>)

Modern Web Guidance gives coding agents expert guidance on browser APIs, CSS, performance, and accessibility, steering them toward native solutions instead of legacy patterns. The repository brings together 232 features and 186 use cases as skills installable in multiple agents.

Its CLI searches locally for a guide and adds it to the agent’s context. The guidance incorporates Baseline compatibility data, targeted fallbacks, and automated evaluation; the project is marked as a preview release.

2026-11-01 · [Markdown](<https://sebastien.rigaux.be/en/tech-watch/links/modern-web-guidance-brings-current-web-practices-to-coding-agents.md>) · [Original resource](<https://github.com/GoogleChrome/modern-web-guidance>)

## [emoji-picker-react: customize a React emoji picker](<https://sebastien.rigaux.be/en/tech-watch/links/emoji-picker-react-customize-a-react-emoji-picker>)

emoji-picker-react provides an emoji picker for React, either with its built-in styling or adapted to a product’s visual design. The interactive playground lets developers try props, CSS themes, and customization examples.

Features include search, skin tones, custom emojis, and multiple languages. Its reactions mode starts with a compact set of popular reactions, then opens access to the full emoji library.

2026-11-01 · [Markdown](<https://sebastien.rigaux.be/en/tech-watch/links/emoji-picker-react-customize-a-react-emoji-picker.md>) · [Original resource](<https://ealush.com/emoji-picker-react/#playground>)

## [OpenTUI builds TypeScript terminal interfaces with a native Zig renderer](<https://sebastien.rigaux.be/en/tech-watch/links/opentui-builds-typescript-terminal-interfaces-with-a-native-zig-renderer>)

OpenTUI lets developers build terminal user interfaces in TypeScript, directly or with React and Solid. Its native renderer is written in Zig, and layouts use flexbox.

The library supports selects, inputs, and scroll boxes controlled by keyboard or mouse. It can also display images, play sounds, and render 3D graphics.

2026-11-01 · [Markdown](<https://sebastien.rigaux.be/en/tech-watch/links/opentui-builds-typescript-terminal-interfaces-with-a-native-zig-renderer.md>) · [Original resource](<https://opentui.com/>)

## [Puck, a visual editor for React: field and canvas updates in 0.24](<https://sebastien.rigaux.be/en/tech-watch/links/puck-a-visual-editor-for-react-field-and-canvas-updates-in-024>)

Puck, a visual page editor for React, adds field groups and tabs in version 0.24, along with a `checkbox` field for selecting multiple options. Drag handles also make it easier to reorder components in nested layouts.

The `renderFields` API lets you compose these layouts. In the canvas, `InlineTextField` enables direct text editing, while `fieldTransforms` transforms values at render time without changing the underlying data.

2026-11-01 · [Markdown](<https://sebastien.rigaux.be/en/tech-watch/links/puck-a-visual-editor-for-react-field-and-canvas-updates-in-024.md>) · [Original resource](<https://puckeditor.com/blog/puck-024>)

## [React: preserve progressive enhancement with Server Actions](<https://sebastien.rigaux.be/en/tech-watch/links/react-preserve-progressive-enhancement-with-server-actions>)

React combines `<form action>`, `useActionState`, and `useOptimistic` to handle pending feedback and optimistic updates while keeping form submission available before JavaScript runs. The article shows how this continuity can enhance the interface after hydration without giving up the browser’s native form behavior.

The key is to keep the server action directly in `action`: inserting a client function breaks submission without JavaScript. For optimistic updates, `useHydrated()` lets the form choose between the server action and its client-enhanced version.

2026-11-01 · [Markdown](<https://sebastien.rigaux.be/en/tech-watch/links/react-preserve-progressive-enhancement-with-server-actions.md>) · [Original resource](<https://ebey.dev/blog/3myyseusgd22h>)

## [C\# 15 unions: exhaustive matching, with boxing to consider](<https://sebastien.rigaux.be/en/tech-watch/links/c-15-unions-exhaustive-matching-with-boxing-to-consider>)

C# 15 introduces the `union` keyword to represent a value drawn from several types without forcing them into a base class or losing their type information in `object`. Andrew Lock shows how `switch` expressions enforce handling every case, and how to declare unions such as `Result<T>`.

One performance detail to weigh: the generated implementation stores the value in an `object`, boxing value types. The article demonstrates a custom implementation using `TryGetValue` to avoid boxing in `switch` expressions.

2026-11-01 · [Markdown](<https://sebastien.rigaux.be/en/tech-watch/links/c-15-unions-exhaustive-matching-with-boxing-to-consider.md>) · [Original resource](<https://andrewlock.net/exploring-the-dotnet-11-preview-2-dotnet-gets-union-types/>)

## [Microsoft Agent Framework: choosing where to intercept calls](<https://sebastien.rigaux.be/en/tech-watch/links/microsoft-agent-framework-choosing-where-to-intercept-calls>)

In Microsoft Agent Framework, `ChatClient` middleware intercepts messages exchanged with the LLM, while agent middleware operates on the agent’s overall run, including session, identity, or token-budget management. This distinction helps place logging or modification at the right level.

The C# example adds function-invocation middleware to log calls to the Researcher agent’s Tavily tool, without changing the other agents. The trace shows the function name and its arguments.

2026-11-01 · [Markdown](<https://sebastien.rigaux.be/en/tech-watch/links/microsoft-agent-framework-choosing-where-to-intercept-calls.md>) · [Original resource](<https://jesseliberty.com/2026/08/08/chatclient-middleware-vs-agent-middleware/>)

## [C\#: IfItQuacks turns duck typing into a library](<https://sebastien.rigaux.be/en/tech-watch/links/c-ifitquacks-turns-duck-typing-into-a-library>)

IfItQuacks lets C# code accept objects that match an interface without implementing it or sharing a base class. The `[DuckTyped]` attribute invokes a source generator that checks compatibility at compile time and creates an adapter—without reflection or `dynamic`.

Anonymous types can also act as test stubs: an object such as `{ Name = "Steven", Age = 90 }` can satisfy an `IPerson` interface. Adapters also preserve identity by forwarding `Equals`, `GetHashCode`, and `ToString` to the wrapped instance.

2026-11-01 · [Markdown](<https://sebastien.rigaux.be/en/tech-watch/links/c-ifitquacks-turns-duck-typing-into-a-library.md>) · [Original resource](<https://steven-giesel.com/blogPost/41599817-4457-441e-b874-1a5c67f4e7cc>)

## [.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>)

## [WordPress RCE flaw targets the update window](<https://sebastien.rigaux.be/en/tech-watch/links/wordpress-rce-flaw-targets-the-update-window>)

A remote code execution flaw in WordPress Core can let an unauthenticated attacker run code during a full-package update if the temporary directory is web-accessible. Wordfence says it blocked 62,969 attempts in 24 hours; a fix is available in version 7.1.4.

The attack hinges on racing cleanup: installer files are unpacked to a predictable path under `wp-content/upgrade`, and attackers are repeatedly probing files such as `setup-config.php` to catch the exposure window, which may last only seconds. The flaw affects versions 4.7 through 7.1.3.

2026-10-31 · [Markdown](<https://sebastien.rigaux.be/en/tech-watch/links/wordpress-rce-flaw-targets-the-update-window.md>) · [Original resource](<https://thehackernews.com/2026/10/wordpress-rce-flaw-draws-nearly-63000.html?m=1&fbclid=IwVERDUAVSgZFleHRuA2FlbQIxMQBwZG9mBWZkaWQWURVldsH84Prb_V9O7MJ8RzmvQSBsuHNydGMGYXBwX2lkCjY2Mjg1NjgzNzkAAR8-ptU2QLdLnxH-DOwi8ZTpvDQvoHH5ARUtADcS_XgLJpuQ6RDMlL_aD1TW9g_aem_-NUl7MFU_kQudSHH6dvgVQ>)

## [CVEngine connects attack-surface discovery with CVE validation](<https://sebastien.rigaux.be/en/tech-watch/links/cvengine-connects-attack-surface-discovery-with-cve-validation>)

CVEngine brings continuous asset discovery, vulnerability scanning, and matching against exploited CVEs into a self-hosted platform. It aims to prioritize flaws that actually apply, using read-only validation and evidence rather than presenting only a list of alerts.

Version 1.3 adds Sentinels to run scans from private networks, along with an OpenVAS integration that is disabled by default. Results feed the same inventory and severity ratings; the tool also provides a REST API and MCP integration.

2026-10-31 · [Markdown](<https://sebastien.rigaux.be/en/tech-watch/links/cvengine-connects-attack-surface-discovery-with-cve-validation.md>) · [Original resource](<https://github.com/hevnsnt/CVEngine>)

## [Mautic: automate marketing while keeping control of your data](<https://sebastien.rigaux.be/en/tech-watch/links/mautic-automate-marketing-while-keeping-control-of-your-data>)

Mautic is an open-source marketing automation platform that brings together campaigns, email, landing pages, and contact management. It can be self-hosted on an organization’s infrastructure, with a REST API and plugins for integration and extension.

The page also highlights drag-and-drop campaign creation, lead scoring, and privacy-focused features. Cited use cases include sending more than a million personalized, multilingual emails daily for an e-commerce business.

2026-10-31 · [Markdown](<https://sebastien.rigaux.be/en/tech-watch/links/mautic-automate-marketing-while-keeping-control-of-your-data.md>) · [Original resource](<https://mautic.org/>)

## [BillionMail: self-host an email platform and campaign workflow](<https://sebastien.rigaux.be/en/tech-watch/links/billionmail-self-host-an-email-platform-and-campaign-workflow>)

BillionMail combines a mail server, newsletters, and email marketing in an open-source, self-hosted package. Its repository outlines a setup flow connecting a domain and DNS verification to campaign creation and sending, with list and tag management.

The project supports Docker and installation through aaPanel. It also integrates RoundCube for webmail, offers delivery analytics, and is licensed under AGPLv3; the team running it remains responsible for hosting the service.

2026-10-31 · [Markdown](<https://sebastien.rigaux.be/en/tech-watch/links/billionmail-self-host-an-email-platform-and-campaign-workflow.md>) · [Original resource](<https://github.com/Billionmail/BillionMail?fbclid=IwZnRzaAVSfsRleHRuA2FlbQIxMQBwZG9mBWZkaWQWURXNcp56FMhsSBMENWsMwQT7qCd6y3NydGMGYXBwX2lkCjY2Mjg1NjgzNzkAAR_MI9RcqU99pGd4uxK2p9-mnrPt77hPr6xfWTGamacb-oeBIqlbmf9PZ_hfIA_aem__boTMF88wTbUjGAZtHUMgQ>)

## [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>)

## [Motherload imports typed YAML, JSONC, CSV and Markdown into TypeScript](<https://sebastien.rigaux.be/en/tech-watch/links/motherload-imports-typed-yaml-jsonc-csv-and-markdown-into-typescript>)

Motherload lets you import data files as TypeScript modules **typed from their contents**. It supports TOML, YAML, JSONC, JSON5, CSV, TSV, Markdown, plain text and `.env` files; types appear in the editor, and `tsc` reports parsing errors with their locations.

Type-checking uses TypeScript 7.1 *content mappers*, currently in beta, and requires `--runExternalCode`. At runtime, a preload or plugin adapts the same imports for Node.js and a range of bundlers.

2026-10-30 · [Markdown](<https://sebastien.rigaux.be/en/tech-watch/links/motherload-imports-typed-yaml-jsonc-csv-and-markdown-into-typescript.md>) · [Original resource](<https://motherload.dev/>)

Page 2 / 22

[Previous](<https://sebastien.rigaux.be/en/tech-watch>)

[Next](<https://sebastien.rigaux.be/en/tech-watch/page/3>)
