Featured Case Study

Real banking,
real ledgers.

TransBank is a fictional retail bank built to prove real engineering discipline. A Postgres ledger under three .NET clients — a Blazor Server ops dashboard, a MAUI consumer app, and a MAUI staff mobile app — all speaking to a single ASP.NET API. Every request is cryptographically attributable. Every write path is guarded by property tests against seven ledger invariants that would break real money if violated.

TransBank

Not a scaffold. A system.

Nine coherent feature commits ship a working core with the guardrails a real bank would ship day one.

What it does

Customer app can view balance, send money, freeze a card, download a monthly statement. Ops staff can watch the ledger in real time, spot fraud, freeze accounts, run reconciliation. Every write to the ledger passes seven invariants before it commits.

Why it's real

Duende IdentityServer with real OIDC + PKCE via the system browser. JWT bearer with role gates in the API. Blazor Server ops dashboard with cookie session + OpenID Connect. Postgres materialized balances reconciled against ledger sums. Not a mock in sight.

How it's proven

121 property tests against a real Postgres testcontainer via WebApplicationFactory. HTTP-level integration tests exercise the whole OIDC handshake. Every INV-1 through INV-7 has a property covering it. The eight-commit history is auditable in one git log.

Five frames tell the story.

The same captures used for the LinkedIn launch carousel — real system, real data, no mockups.

Ops Overview dashboard
Beat 03 · Ops Overview

Real product surface

KPI cards, hourly volume chart, transaction mix donut. Gold Live pill auto-refreshes every 5s. Gold OPS.ADMIN role pill in the sidebar, straight from the JWT claim.

Consumer MAUI app and browser mid-OIDC
Beat 07 · Cross-platform auth

MAUI + system browser

Native Windows MAUI window opens the OS browser to IdentityServer's login page via RFC 8252 loopback. Password never touches the app. PKCE end to end.

Same transfer visible in Ops Live transfers and Alice's Home
Beat 10 · One ledger, two clients

Same truth, arrowed.

The exact ledger_entries INSERT the Consumer just committed shows up at the top of the Ops Live transfers feed. No materialized view; no separate history. Both apps read the same table. Auto-refresh every 5s.

Real 3-page monthly PDF statement
Beat 14 · Monthly statement PDF

Ledger doing its job.

Three-page PDF: opening $0 + money in $13,007.95 − money out $423.38 = closing $12,584.57. Running-balance column proves the ledger is internally consistent. INV-1 and INV-4 in one PDF.

One-page technical brief PDF
Beat 15 · Architecture at a glance

The system describes itself.

One-page A4 brief rendered by the SAME QuestPDF code path that ships customer statements. Seven invariants, layered architecture, auth surface, proof — all on one page.

The seven invariants — and the eight-commit journey.

Real banking systems break in interesting ways when they violate these. TransBank tests each one after every mutation path.

#InvariantWhere it's enforced
INV-1Every transaction sums to zero across its ledger entriesTransferService · property tests
INV-2Ledger entry currency equals the account's currencyValidation + property test
INV-3The application role cannot UPDATE or DELETE ledger entriesPostgres grants · integration test
INV-4Materialized balance equals SUM(ledger entries) per accountReconciliation dashboard · property test
INV-5Customer accounts cannot go negativeBalance guard + FOR UPDATE lock
INV-6Amounts are positive integers in minor units — no floatsbigint column + DB CHECK constraint
INV-7One idempotency key maps to at most one transactionUNIQUE index

The auth surface

Two schemes, three flows, one identity server.

  • Consumer — OIDC + PKCE via the system browser (RFC 8252 loopback). Tokens in SecureStorage.
  • Ops — Blazor Server with OIDC + Cookie session. Role claims (ops.viewer, ops.admin) gate every endpoint.
  • API — JWT Bearer for both audiences (transbank.api + transbank.ops) via ValidAudiences plural. Legacy header path retired.

The eight-commit journey

cards §1Wallet — issue, freeze, unfreeze. XAML card art with FROZEN overlay. cards §2Card charging + per-card activity feed. New Merchant + CardId on Transaction. cards §3Ops surface for card management + fraud rules (card-testing pattern, frozen retries). statementsMonthly PDF export from Consumer Profile via QuestPDF. duende §1Consumer switches from mock header to real JWT via ROPC. duende §2OIDC + PKCE via system browser. Branded login page. SecureStorage session. brandTransBank logo + 7-step splash + hover pulse across every surface. duende §3Ops onto OIDC + role claims. Legacy X-Customer-Id header retired everywhere.

The engineer behind TransBank.

Azim Litanga

Azim Litanga

Founder · LogicDynamics

Building .NET systems that prove themselves. TransBank is one of five featured applications shipped under LogicDynamics — every commit tells a self-contained story about how a real banking core defends its own invariants under real load.