Cluster ERP is a modular enterprise resource planning system written in Python. This page describes its scope as the code defines it: the server, the three ways to reach it, and the 28 backend modules with one line each. It does not explain how the parts work together; see the architecture overview for that.
In short¶
- The package is named
cluster-erp, describes itself as a "Modular Enterprise Resource Planning System", and declares a proprietary license (pyproject.toml:5-10,LICENSE). - The server is a FastAPI application built by the factory
create_app(src/cluster_erp/server/app.py:1287). - Business features live in 28 modules under
src/cluster_erp/modules/. Each one subclassesModuleBase(src/cluster_erp/core/module_base.py:14). - There are three clients: the web app in
webapp/, the PySide6 desktop client, and the HTTP API itself (src/cluster_erp/server/app.py:1633-1644,pyproject.toml:86-88). - The project rules aim at all countries and many languages.
How it works¶
The server process starts from python -m cluster_erp.server.main, which runs uvicorn with the create_app factory (src/cluster_erp/server/main.py:39-41). At start-up the module registry loads every enabled module, and each module adds its routes, EventBus handlers, and screen metadata (src/cluster_erp/core/module_registry.py:32-56). The details are on server startup and app factory and module lifecycle.
The three clients¶
| Client | What it is | Entry point | Source |
|---|---|---|---|
| Web app | A vanilla JavaScript single-page app served by the same server at /app |
webapp/index.html |
src/cluster_erp/server/app.py:1633-1644 |
| Desktop client | A PySide6 application installed through the desktop extra |
cluster-erp-desktop script, cluster_erp.desktop.main:main |
pyproject.toml:68-73, pyproject.toml:88 |
| HTTP API | JSON routes under /api/v1/, one prefix per module |
ModuleBase.api_prefix |
src/cluster_erp/core/module_base.py:36-38 |
Both clients draw their screens from the module metadata served at GET /api/v1/_meta (src/cluster_erp/server/app.py:1518-1556). The web app section and the desktop section document the clients.
The 28 backend modules¶
The table lists every folder in src/cluster_erp/modules/ (28 folders, counted with ls, excluding __pycache__). The description column quotes the module's own description property. The default value of enabled_modules lists the same 28 names (src/cluster_erp/config/settings.py:535-564).
| Module | Description from code | Source |
|---|---|---|
analytics |
Analytics: semantic layer, safe query generation, correctness gates | src/cluster_erp/modules/analytics/module.py:39 |
app_store |
App catalogue, entitlements and installs | src/cluster_erp/modules/app_store/module.py:36 |
auth |
Authentication, authorization (RBAC + ABAC), and approval chains | src/cluster_erp/modules/auth/module.py:26 |
bom |
Bill of Materials, multi-level product structure management | src/cluster_erp/modules/bom/module.py:30 |
calendars |
Working-time templates, calendars, and exceptions | src/cluster_erp/modules/calendars/module.py:27 |
costing |
Cost analysis, labor/overhead rates, CBS, margin calculation | src/cluster_erp/modules/costing/module.py:26 |
crm |
Customer and RFQ management with state machine and inbox | src/cluster_erp/modules/crm/module.py:29 |
currencies |
Currency management and exchange rate tracking | src/cluster_erp/modules/currencies/module.py:29 |
design_engineering |
Design lifecycle, versioning, and engineering change notes (ECN) | src/cluster_erp/modules/design_engineering/module.py:26 |
documents |
Document management with versioning and approval workflows | src/cluster_erp/modules/documents/module.py:29 |
fleet |
Fleet management: vehicles, machines, custom tracking | src/cluster_erp/modules/fleet/module.py:150 |
intranet |
Intranet: news, policies, directory, leave, requests, delivery | src/cluster_erp/modules/intranet/module.py:45 |
inventory |
Inventory management: warehouses, stock levels, batch and serial tracking | src/cluster_erp/modules/inventory/module.py:27 |
logs |
Activity and error logging | src/cluster_erp/modules/logs/module.py:26 |
mail |
Connect external mail accounts (Gmail/Outlook/IMAP) and read/compose mail | src/cluster_erp/modules/mail/module.py:29 |
nesting |
Sheet-metal nesting optimization: layout planning and material utilization | src/cluster_erp/modules/nesting/module.py:26 |
owned_organisations |
Manage owned organisations, departments, and employees | src/cluster_erp/modules/owned_organisations/module.py:29 |
parties |
Manage all parties: individuals, organisations, addresses, and communication channels | src/cluster_erp/modules/parties/module.py:33-35 |
privacy |
Data-subject requests: access, rectification, erasure, objection | src/cluster_erp/modules/privacy/module.py:36 |
procurement |
Purchase requests, purchase orders, critical materials, MRP, substitution groups | src/cluster_erp/modules/procurement/module.py:29 |
production |
Production management: work centers, routings, production orders | src/cluster_erp/modules/production/module.py:29 |
products_and_services |
Material master: products, services, categories, and units | src/cluster_erp/modules/products_and_services/module.py:29 |
projects |
Project management, kick-off, schedules, actions, and fixtures | src/cluster_erp/modules/projects/module.py:29 |
purchasing_quotations |
Supplier quotation register: standalone and RFQ-linked quotations, comparison, award, price history | src/cluster_erp/modules/purchasing_quotations/module.py:30-33 |
quotations |
Quotation management with feasibility, costing, and approval workflow | src/cluster_erp/modules/quotations/module.py:29 |
records |
Record lifecycle: deactivation reasons and reactivation | src/cluster_erp/modules/records/module.py:34 |
sales_orders |
Sales orders: PO check and frozen PO revisions, units, shipments, proof of delivery, export documents | src/cluster_erp/modules/sales_orders/module.py:29-32 |
subscriptions |
Recurring subscription plans and customer subscriptions | src/cluster_erp/modules/subscriptions/module.py:26 |
Some descriptions are lightly edited in the table: punctuation dashes are replaced by commas, "&" is written as "and", and the sales_orders text omits the words "(assets)" and "with packages, transport". Each module has its own page in the modules section.
Why it is built this way¶
The project's written engineering rules state the intent: the product targets all countries. Language, currency, date format, address structure, and tax system must work independently of the country. A new language is a new JSON file with no code change. Reference data such as countries, address levels, and currencies is kept in the database, not in code.
The code reflects parts of this intent:
- The web app reads its language list from
webapp/i18n/languages.json, which liststranden. - Currencies are rows of
core_currencies, seeded from the ISO 4217 set (src/cluster_erp/core/currencies.py:57-89,src/cluster_erp/core/currencies.py:1811-1852). - Countries are rows of
parties_countries, seeded at start-up by thepartiesmodule (src/cluster_erp/modules/parties/settings/models.py:12-13,src/cluster_erp/modules/parties/module.py:41-42).
See reference data and core i18n for the details.
Rules and boundaries¶
The project's written engineering rules list binding rules: no guessing, no hardcoding, no direct module-to-module calls, Decimal money, no hard delete, the mandatory product, model, and version breakdown, and a metadata-driven web app. The platform section shows the code that enforces each rule, and the decisions section records them.
Interaction with other parts¶
The server, the clients, and the modules meet in three places: the HTTP API, the metadata document, and the EventBus. The architecture overview draws this as one diagram.
Limits and open points¶
- The FastAPI application reports version
0.1.0(src/cluster_erp/server/app.py:1296-1298), andpyproject.toml:7declares the same. Release tags such asv0.1.37appear in the git history. How the two version numbers relate is not determined from code. - Which countries a deployment serves is runtime data. It is not determined from code.
Terms introduced¶
| Term | Code identifier | Definition | Turkish term | Source |
|---|---|---|---|---|
| module | ModuleBase |
A backend package under src/cluster_erp/modules/ that owns its routes, events, and metadata. |
modül | src/cluster_erp/core/module_base.py:14 |
| web app | webapp/ |
The browser client in webapp/ that the server serves at /app. |
web uygulaması | src/cluster_erp/server/app.py:1633-1644 |
Related pages¶
Verified against commit 92f8051 on 2026-11-13.