Skip to main content

Introduction & Architecture

Zerp is a Laravel 12 + Inertia.js + React (TypeScript) ERP/SaaS platform. The main app is a thin core (auth, tenancy, billing, the Media Library, module loader) - almost every business feature (HRM, CRM, Accounting, POS, Support Ticket, ...) ships as a separate, independently versioned Composer package under the zerp-pk GitHub org.

Why packages, not a monolith​

Each module is a real Composer package (zerp/<module>) with its own repository, its own Packagist-style version tags, and its own composer.json. This means:

  • Modules can be developed, versioned, and released independently.
  • The core app only depends on the modules it actually needs.
  • Contributors can work on one module without checking out the entire platform.

How modules attach to the core app​

In local development, the core app's composer.json points at module packages via local path repositories, resolved against a sibling directory (commonly checked out as ZerpPackages/ next to zerp/):

{
"repositories": [
{"type": "path", "url": "../ZerpPackages/product-service", "options": {"symlink": true}}
],
"require": {
"zerp/product-service": "@dev"
}
}

Composer symlinks each package into vendor/zerp/<module>. In production, the same require line instead resolves against the module's real tagged release on Packagist/VCS - no path repository needed.

Where things live​

ConcernLocation
Core app (auth, tenancy, billing, Media Library, module loader)zerp-pk/zerp
Feature moduleszerp-pk/<module> (e.g. zerp-pk/product-service, zerp-pk/hrm)
This docs sitezerp-pk/docs

See Getting Started to set up all of the above locally, Module Development for how a module is structured, and The Media Library for the shared file-storage system every module builds on.