OpenBank Labs / Shared banking intelligence

A shared kernel
for modern banks.

Every bank needs to count money, understand business days and speak payment rails. Those rules should be written once, tested deeply and shared.

OpenBank Labs: lioness scientist and bot illustrating layers of the shared banking kernel.
OpenBank Labs artwork with the Lípa identity · illustrative module diagram; the repository is the source of truth.

From common logic to extraordinary banks.

Build on what matters.

Inside openbank-libs

The banking knowledge
services share.

The domain core is plain Kotlin without framework dependencies. Shared types and rules help services agree at the source instead of reconciling differences later.

01 / DOMAIN CORE

Money, identity & time

Money types with rounding policy, IBAN and Czech account checks, identity numbers and a banking calendar that handles working days and Easter.

Explore libs-domain ↗
02 / CREDIT MATH

Loans that add up

Amortization, APRC, IFRS 9 and delinquency calculations are shared building blocks rather than slightly different implementations in every service.

Explore libs-lending ↗
03 / PAYMENT LANGUAGE

ISO 20022

Reusable messages for pacs.008, pacs.002, pacs.004 and camt.054/056 make payment flows speak the same language.

Explore libs-iso20022 ↗
04 / RELIABLE RUNTIME

Rules around the work

Transactional outbox, idempotency, audit and authorization primitives reduce the need to rebuild the same infrastructure service by service.

Explore libs-runtime ↗
05 / MONEY FLOWS

Durable workflows

Shared temporal patterns help long-running banking work remain explicit and recoverable.

Explore libs-temporal ↗
06 / PROOF

Test the promises

Testcontainers, money generators for property tests and conformance checks help prove outbox and authorization behavior.

Explore libs-testing ↗

From OpenBank Labs · QRlessPay SDK

The QR payment.
Without the camera.

QRlessPay carries the same SPAYD payment descriptor a QR code would carry, directly from one phone to another over Bluetooth Low Energy. A bank-agnostic profile and public Swift/Kotlin SDK aim to let different banks and app platforms exchange a payment request with one tap.

The payer still sees the recipient and amount, confirms the proposal and authorizes the payment in their own bank app. Settlement stays on the bank's existing account-to-account rail.

Early reference SDK · public source and conformance tests; physical two-device interoperability has not yet been demonstrated.

01 · REQUESTPayeeBank A app
BLE
02 · CONFIRMPayerBank B app
SPAYD payload, not pixelsExisting A2A payment rail →
BLEReference transport
UWBOptional proximity check
NFCFuture research

Open source · open questions

No one should write APRC
for the hundred and first time.

The ambition is a reusable bank kernel: shared foundations that leave teams free to build their own customer experience.