Skip to content

Repository files navigation

🏦 Mkhungo Core Platform

An initiative by Mkhungo Financial Technologies (MFT)

A BIAN-Informed Universal Banking Modular Monolith

"Enforcing the spirit of Mfowethu through enterprise-grade software infrastructure."


πŸ“– Executive Summary

The Mkhungo Core Platform is an architectural Proof of Concept (PoC) exploring how a large universal banking capability landscape can be organised as a modular enterprise Java application.

Built using a Modular Monolith architecture with Spring Modulith, the platform is organised around explicit banking domains covering areas such as core banking, payments, lending, treasury, insurance, wealth management, risk, compliance, enterprise support, and digital channels.

The project's high-level domain taxonomy is informed by the Banking Industry Architecture Network (BIAN) landscape, which provides a reference vocabulary for identifying and grouping banking capabilities.

Phase 0 does not attempt to implement a complete production banking platform.

Instead, it focuses on establishing and validating the architectural foundations required for a large enterprise application:

  • Domain decomposition
  • Modular boundaries
  • Dependency control
  • Banking capability organisation
  • Multi-project build structure
  • Architectural verification
  • Evolutionary architecture

The central question explored by this PoC is:

How can a large universal banking capability landscape be represented as strongly bounded application modules without prematurely introducing the operational complexity of a distributed microservice architecture?


🧭 Architectural Intent

The primary purpose of this project is architectural exploration.

The PoC investigates how a complex enterprise domain can be decomposed into coherent application modules while retaining the simplicity of a single deployable application.

The architecture focuses on:

  • Identifying meaningful domain boundaries
  • Organising banking capabilities into cohesive modules
  • Preventing accidental coupling between modules
  • Enforcing architectural constraints through automated tests
  • Preserving future architectural optionality
  • Allowing individual banking capabilities to be implemented incrementally

The objective is therefore not to simulate every operation of a real-world bank.

Instead, Phase 0 establishes an architectural foundation from which individual banking capabilities can evolve.


πŸ›οΈ Architectural Paradigm

1. Modular Monolith

The platform follows a modular monolith architecture implemented with Spring Modulith.

The system remains a single deployable application while internally organising functionality into explicit domain modules.

                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                    β”‚      MFT Core Platform      β”‚
                    β”‚                             β”‚
                    β”‚     Single Application      β”‚
                    β”‚                             β”‚
                    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
                    β”‚             β”‚               β”‚
                    β–Ό             β–Ό               β–Ό
               Core Banking    Payments       Lending
                    β”‚             β”‚               β”‚
                    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
                    β”‚             β”‚               β”‚
                    β–Ό             β–Ό               β–Ό
                 Treasury      Insurance        Risk
                    β”‚
                    β–Ό
              Other Domains
                    β”‚
                    β–Ό
          Explicit Module Boundaries

This approach provides:

  • A single deployment unit
  • Simplified infrastructure
  • Local transactional consistency
  • Faster development and debugging
  • Explicit internal boundaries
  • Controlled module dependencies

The architecture deliberately avoids premature microservice fragmentation.


2. BIAN-Informed Domain Organisation

The platform's high-level domain taxonomy is informed by BIAN banking concepts and is used as an organising framework for decomposing universal banking capabilities.

The project is not presented as a complete or certified implementation of the BIAN standard.

Instead, BIAN provides a reference vocabulary for identifying and grouping banking concerns into coherent architectural domains.

This allows the project to begin with a broad enterprise capability map rather than allowing technical implementation details to define the architecture.


3. Evolutionary Architecture

The modular boundaries are designed to preserve future architectural optionality.

As the platform evolves, individual modules may be expanded, redesigned, orβ€”where justified by operational requirementsβ€”considered for extraction into independently deployable services.

The current architecture deliberately reduces unnecessary coupling so that future evolution does not require restructuring the entire platform.

However, module extraction would introduce distributed-systems concerns such as:

  • Independent data ownership
  • Network communication
  • Eventual consistency
  • Distributed transactions
  • Authentication and authorisation
  • Observability
  • Deployment complexity
  • Operational resilience

Microservices are therefore treated as an architectural option, not as a default destination.


πŸ“ Architecture Principles

1. Domain Before Technology

Business capabilities determine the primary module boundaries.

Banking Capability
        β”‚
        β–Ό
Domain Module
        β”‚
        β–Ό
Application Logic
        β”‚
        β–Ό
Infrastructure

The architecture begins with:

What capability does the organisation require?

rather than:

What controller, service, or repository should be created?


2. Modular Monolith First

The platform begins as a single deployable application with explicit internal boundaries.

Distributed architecture should emerge when justified by:

  • Independent scaling requirements
  • Team ownership
  • Deployment requirements
  • Operational constraints
  • Availability requirements

rather than being introduced by default.


3. Controlled Dependencies

Modules should communicate through explicitly defined contracts and application events rather than arbitrary access to internal implementation details.

The objective is to minimise unnecessary coupling and prevent individual modules from gradually becoming dependent on the internal structures of other domains.


4. Architecture as an Executable Constraint

Architecture is not treated as documentation that developers are expected to remember manually.

Architectural boundaries are verified through automated tests.

If an implementation introduces an invalid dependency between modules, the build can detect the violation.


5. Evolutionary Design

The architecture is designed for incremental expansion.

Modules are implemented when the relevant banking capability enters scope rather than being populated simply to satisfy a predefined technical structure.

The complete capability landscape therefore provides the architectural map, while Phase 0 focuses implementation effort on selected domains.


πŸ› οΈ Technical Stack

Category Technology Version / Details
Language Java 21 LTS
Framework Spring Boot 4.0.0-M1
Architecture Spring Modulith 1.3.1
Build System Gradle Kotlin DSL 8.14
Database β€” PoC H2 Database In-memory
Database β€” Future PostgreSQL Planned integration
Logging Logback / SLF4J Rolling application logging
Observability Spring Boot Actuator Health and metrics
Testing JUnit 5 / Spring Modulith Test Module boundary verification

πŸ“‚ Project Structure

The repository is organised into a central application runtime and domain modules representing major banking capability areas.

mkhungo-core-platform/
β”‚
β”œβ”€β”€ core-app/                          # Central Spring Boot runtime
β”‚   └── src/main/
β”‚       β”œβ”€β”€ java/za/co/mkhungo/platform/
β”‚       β”‚   └── MftApplication.java    # Application entry point
β”‚       β”‚
β”‚       └── resources/
β”‚           β”œβ”€β”€ application.yml        # Platform configuration
β”‚           └── logback-spring.xml     # Logging configuration
β”‚
β”œβ”€β”€ modules/                           # Banking domain modules
β”‚   β”‚
β”‚   β”œβ”€β”€ core-banking/
β”‚   β”‚   β”œβ”€β”€ customer/
β”‚   β”‚   β”œβ”€β”€ account/
β”‚   β”‚   β”œβ”€β”€ transaction/
β”‚   β”‚   └── product-catalog/
β”‚   β”‚
β”‚   β”œβ”€β”€ payments-clearing/
β”‚   β”‚   β”œβ”€β”€ payments-core/
β”‚   β”‚   β”œβ”€β”€ debit-mandate/
β”‚   β”‚   β”œβ”€β”€ cross-border/
β”‚   β”‚   └── cards/
β”‚   β”‚
β”‚   β”œβ”€β”€ lending-credit/
β”‚   β”‚   β”œβ”€β”€ lending-core/
β”‚   β”‚   β”œβ”€β”€ mortgage/
β”‚   β”‚   β”œβ”€β”€ trade-finance/
β”‚   β”‚   └── collateral/
β”‚   β”‚
β”‚   β”œβ”€β”€ treasury-markets/
β”‚   β”‚   β”œβ”€β”€ forex/
β”‚   β”‚   β”œβ”€β”€ treasury/
β”‚   β”‚   β”œβ”€β”€ derivatives/
β”‚   β”‚   └── securities/
β”‚   β”‚
β”‚   β”œβ”€β”€ insurance/
β”‚   β”‚
β”‚   β”œβ”€β”€ wealth/
β”‚   β”‚
β”‚   β”œβ”€β”€ risk-compliance/
β”‚   β”‚   β”œβ”€β”€ compliance/
β”‚   β”‚   β”œβ”€β”€ regulatory-reporting/
β”‚   β”‚   └── audit-trail/
β”‚   β”‚
β”‚   β”œβ”€β”€ enterprise-support/
β”‚   β”‚   β”œβ”€β”€ document-management/
β”‚   β”‚   β”œβ”€β”€ notification/
β”‚   β”‚   β”œβ”€β”€ workflow/
β”‚   β”‚   └── integration/
β”‚   β”‚
β”‚   └── channels/
β”‚       β”œβ”€β”€ mobile-api/
β”‚       β”œβ”€β”€ internet-api/
β”‚       β”œβ”€β”€ branch-api/
β”‚       └── open-banking/
β”‚
β”œβ”€β”€ build.gradle.kts                   # Root build orchestration
β”œβ”€β”€ settings.gradle.kts                # Project hierarchy
β”œβ”€β”€ gradle.properties                  # Gradle configuration
└── gradlew / gradlew.bat              # Gradle wrapper

Each module represents a bounded area of banking functionality and provides an explicit location for capability-specific implementation as the platform evolves.


🎯 Phase 0 PoC Scope

Phase 0 deliberately limits implementation scope while preserving the broader banking capability map.

The project distinguishes between:

  • Active modules containing implemented domain logic
  • Planned modules representing future banking capabilities

🟒 Active Phase 0 Modules

These modules currently participate in the PoC and contain active source code, domain logic, and persistence structures.

Category Active Modules
Core Banking customer, account, transaction
Payments payments-core
Lending lending-core
Treasury forex
Insurance insurance-core
Risk & Compliance compliance, regulatory-reporting, audit-trail

These modules provide the initial implementation surface for validating the modular architecture.


βšͺ Planned Modules

The remaining banking capabilities are represented as Gradle sub-projects to preserve the intended architectural map and provide explicit locations for future implementation.

Examples include:

  • Trade Finance
  • Derivatives
  • Wealth Management
  • Open Banking
  • Cards
  • Mortgage
  • Securities
  • Document Management
  • Workflow
  • Digital Channels

These modules do not currently contribute business functionality to the Phase 0 runtime.


πŸ›‘οΈ Architectural Boundary Verification

A modular architecture is only useful if its boundaries remain protected as the system evolves.

The platform includes automated architectural verification using Spring Modulith to validate that application modules respect the dependency rules defined by the architecture.

The verification process helps detect architectural erosion such as:

  • Illegal dependencies between modules
  • Unintended coupling
  • Circular module relationships
  • Internal implementation details leaking across boundaries
Developer Change
        β”‚
        β–Ό
Automated Architecture Test
        β”‚
        β–Ό
Module Boundary Verification
        β”‚
        β”œβ”€β”€ Valid Architecture
        β”‚        β”‚
        β”‚        β–Ό
        β”‚   Build Continues
        β”‚
        └── Boundary Violation
                 β”‚
                 β–Ό
              Build Fails

Architecture therefore becomes an executable engineering constraint rather than a convention that developers are expected to remember manually.

Run the Boundary Verification

# Windows
.\gradlew.bat :core-app:test --tests "za.co.mkhungo.platform.ArchitectureBoundaryVerificationTest"

# Linux / macOS
./gradlew :core-app:test --tests "za.co.mkhungo.platform.ArchitectureBoundaryVerificationTest"

The verification tests may also generate architectural documentation to support ongoing visibility into module relationships.


πŸš€ Getting Started

Prerequisites

  • Java 21 LTS
  • IntelliJ IDEA recommended
  • Gradle Wrapper included

No external database installation is required for Phase 0.

The PoC uses an H2 in-memory database for local development and architectural experimentation.


Running the Application

Via IntelliJ IDEA

  1. Clone the repository.
git clone https://github.com/NMandisa/mkhungo-core-platform.git
cd mkhungo-core-platform
  1. Open the project root in IntelliJ IDEA.
  2. Allow Gradle to synchronise the project.
  3. Navigate to:
core-app/src/main/java/za/co/mkhungo/platform/MftApplication.java
  1. Run the main() method.

Via Command Line

Linux / macOS

./gradlew :core-app:bootRun

Windows

.\gradlew.bat :core-app:bootRun

🌐 Accessing the Platform

Once the application starts, the following development endpoints are available.

The platform uses the following application context path:

/mft-api

H2 Database Console

Inspect the in-memory database schema and development data.

http://localhost:8080/mft-api/h2-console

JDBC URL

jdbc:h2:mem:mkhungo_core_db

Username

sa

Password

Leave blank.


Spring Boot Actuator

Health

http://localhost:8080/mft-api/actuator/health

Metrics

http://localhost:8080/mft-api/actuator/metrics

These endpoints provide basic runtime visibility during Phase 0 development.


πŸ”¬ What This PoC Demonstrates

The Mkhungo Core Platform explores several enterprise engineering and architecture concerns.

Capability Demonstration
Domain Architecture Banking capabilities organised into coherent domain modules
Modular Architecture Explicit application module boundaries
Enterprise Java Java 21 and Spring Boot
Evolutionary Architecture Modular monolith with future architectural optionality
Architecture Testing Automated verification of module dependencies
Multi-Project Builds Gradle-based modular project organisation
Domain Modelling Banking capability organisation informed by BIAN concepts
Operational Foundations Actuator, logging, testing and reproducible builds

The purpose of the PoC is not to claim production banking completeness.

The purpose is to explore how a large enterprise banking application can begin with a disciplined architectural structure before individual capabilities are incrementally implemented.


πŸ—ΊοΈ Architectural Evolution

The intended evolution of the platform follows an incremental approach.

Phase 0
β”‚
β”œβ”€β”€ Establish domain boundaries
β”œβ”€β”€ Validate modular architecture
β”œβ”€β”€ Implement selected core capabilities
└── Automate architectural verification
        β”‚
        β–Ό
Phase 1
β”‚
β”œβ”€β”€ Expand active banking domains
β”œβ”€β”€ Introduce richer domain behaviour
β”œβ”€β”€ Strengthen persistence and integration
└── Introduce PostgreSQL
        β”‚
        β–Ό
Phase 2
β”‚
β”œβ”€β”€ External integration
β”œβ”€β”€ API and channel expansion
β”œβ”€β”€ Event-driven workflows
└── Security and access management
        β”‚
        β–Ό
Future Evolution
β”‚
β”œβ”€β”€ Independent scaling where justified
β”œβ”€β”€ Selective module extraction where justified
β”œβ”€β”€ Distributed deployment if required
└── Expanded enterprise capability coverage

The architecture is intended to evolve according to demonstrated requirements rather than prematurely adopting distributed complexity.


🧠 Engineering Philosophy

The project reflects a broader engineering principle:

Enterprise architecture should make complexity manageable, not merely distribute it.

A large system does not become architecturally mature simply because it contains many microservices.

The objective is first to understand:

  • The business domain
  • The system boundaries
  • The dependencies
  • The data relationships
  • The operational constraints
  • The consequences of architectural decisions

Only then can technology choices be evaluated against actual requirements.

The Mkhungo Core Platform explores those principles within the context of universal banking.


πŸ“œ Corporate Identity

Mkhungo Financial Technologies (MFT)

Built on the unshakeable foundation of Mfowethu.

Property Value
Project Type Enterprise Architecture Proof of Concept
Phase Phase 0
Architecture Modular Monolith
Primary Domain Universal Banking
Status Active Development
Author Noxolo M. Mkhungo

Β© 2026 Mkhungo Financial Technologies. All rights reserved.

About

Exploring what Spring Boot 4 and the Spring Framework have in store, using the banking domain as a practical proof of concept via a BIAN-aligned modular monolith.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages