1
Transaction orchestration
A sign-in is a transaction with an explicit state, a lifetime and a single outcome. It survives a change of device, expires on its own, is idempotent to repeats and lands in the audit trail — instead of a request left hanging somewhere between the browser and the messenger.
2
Channel adapters
Telegram, WhatsApp, Email and others — switched on by configuration. A channel of your own needs no change to the core, and it does not have to be .NET: an external service in any language over HTTP, or the bot you already run, as it is. Your channels take their place in the chain alongside the built-in ones.
3
Integration
Any stack, standard OIDC. On .NET — a connector on top of OpenIddict. Everywhere else — a standard OIDC provider: Node, Java, Python, Go, PHP. In an IAM such as Logto it is added as an ordinary social connector in a couple of minutes.
4
Settings and multi-project support
Tokens, channels, the texts and branding of the sign-in page, policies, limits, the audit trail — all of it is configuration, with four levels of ownership, including the core, the tenant and the application, and a defined resolution order. One installation serves many projects and bots, each with its own.
5
Audit trail and observability
The audit trail follows your rules and can be switched off entirely. Identities are always masked and tokens are written neither to the log nor to the audit — that is how it is built, not a setting you have to remember. Metrics, logs and traces come the same way.
6
Stack
.NET 10, shipped as NuGet packages — plugged into a running application. Clean architecture; storage in memory, EF Core (PostgreSQL, MySQL and others) or Redis. The sign-in page is plain JS — no frameworks, no external dependencies. The data does not leave your perimeter.