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