Skip to content
Back to work

Leaf — Modular Business Platform

A .NET modular monolith that lets Italian SMEs make the systems they already own work together, without replacing any of them.

Client work — source not public

Type
Platform
Period
2024 — present
Status
In progress
Role
Architect & Lead Developer

The problem

Italian SMEs rarely lack software. They have an accounting package, a CRM, a warehouse system — and none of them talk to each other. The gaps get filled by people: someone re-types the invoice number, someone reconciles two exports in a spreadsheet, someone notices on Thursday that Tuesday’s order never reached production.

The commercial answer is to sell them a suite that replaces everything. That answer is wrong for this market. The systems already in the building are load-bearing, the staff know them, and migration budgets do not exist. What is missing is not another system of record — it is the layer between them.

What I built

Leaf is the platform that layer is built on: business modules that plug into one host and one deployment, sharing identity, messaging, telemetry and a common set of primitives. A customer runs the whole thing on a single modest server, and a new module arrives without redesigning what is already there.

Two rules hold it together. No module ever reaches into another module’s domain, and any module can be pulled back out later if a real operational reason ever appears. Everything else follows from those two.

Where it stands

Three business modules run on the platform today, booted from one deployment. New module work starts from a defined skeleton with the boundaries already drawn — which is the difference between a platform and a folder of related projects.

What I did

  • Wrote the platform architecture standard that governs every module, and made it normative over the older per-module documents
  • Designed the host that composes business modules through dependency injection, one deployment, one database
  • Built four platform components published as NuGet packages: shared domain primitives, identity, event bus and telemetry
  • Made every optional component inert by default, so a module that does not configure it still runs
  • Set up reusable CI/CD workflows with automated versioning driven by commit conventions

Impact

  • New modules start from a defined skeleton instead of a blank page
  • A component upgrade reaches every module through a version range, not a copy-paste

Stack

  • .NET 10
  • PostgreSQL
  • Docker
  • RabbitMQ
  • OpenTelemetry
  • GitHub Actions
  • Modular monolith
  • DDD

By the numbers

4
Platform components
3
Business modules on it
1
Deployment units

Recognise one of these problems?

If any of this looks like the system you are living with, that is usually a good place to start a conversation.