Built like infrastructure.
A multi-tenant platform for regulated finance — .NET 9 and Angular 18, isolated per tenant, configurable per team, auditable to the event.
Multi-Tenant, Multi-Region
Each tenant runs in its own database, pinned to a data-residency region and resolved per request from the JWT — with a control plane to provision and migrate them.
Configurable Decision Pipeline
An ordered set of compliance checks runs per tenant. A failing check never aborts the run, and the engine only ever clears or holds — humans make the reject.
Identity-Graph Fraud Engine
A per-tenant identity graph links applications by hashed attributes and scores duplicate identities, shared devices and rings on a 0–1000 scale.
Enterprise Auth & RBAC
JWT bearer auth with mandatory TOTP MFA, refresh tokens, single active session and both static and dynamic role-based permissions.
API-First & Webhooks
REST onboarding and schema-driven ingestion APIs, HMAC-verified inbound webhooks, outbound decision webhooks, and a React Native / Expo mobile SDK.
Explainable by Design
Deterministic scorecards and a recorded per-check breakdown mean every decision shows exactly which checks fired — with an immutable audit trail.
From ingest to reviewed decision.
LAYER 01
Ingest
LAYER 02
Validate
LAYER 03
Evaluate
LAYER 04
Decide
LAYER 05
Notify
Backend
.NET 9 · ASP.NET Core · EF Core · CQRS
Frontend
Angular 18 · Material · NgRx
Data
SQL Server / Azure SQL · per-tenant
Delivery
Docker · Nginx · region zones
Onboard by API, deliver by webhook.
Register a customer, get a magic link back, and receive a webhook the moment a decision lands — authenticated with a tenant-scoped JWT.
# Register a customer & start onboarding
POST /api/v1/external/onboarding/register
Authorization: Bearer •••
{
"email": "ada@meridian.io",
"journey": "kyc-retail"
}201 Created
{
"customerId": "cus_8f21",
"magicLink": "https://onboard.thynqora.app/j/•••",
"status": "started"
}# Webhook fired on decision
→ POST https://you.example/webhooks 200
{ "event": "customer.approved", "customerId": "cus_8f21" }