Skip to main content

Architecture

Empora is a small ecosystem. This page explains how the pieces fit together so developers and technical store owners know what runs where.

The three surfaces​

You install only the plugin. The web app and API are hosted services.

1. The WordPress plugin​

The plugin (empora-for-woocommerce) is organised around a module registry:

  • Each feature lives in its own module directory under includes/Modules/ (78 modules).
  • A module implements a common interface (ModuleInterface / AbstractModule) and is registered with the ModuleRegistry.
  • Enabling a module (from the Modules grid) registers its hooks, REST routes, and front-end behaviour; disabling it unregisters them — cleanly, without deleting data.
  • Settings for every module are stored behind one option (aiowc_module_settings).
  • A REST layer (namespace aiowc/v1) exposes per-module endpoints that the React admin calls.
  • A Dashboard with a config checker surfaces pending-setup items (ok / todo).
  • A License client activates/validates against the backend and gates premium modules by entitlement.
  • A premium Updater checks the backend for updates of the premium build.

The admin UI is a React application (built with Vite) embedded in the WordPress admin, talking to the plugin's REST endpoints.

2. The marketing + dashboard web app​

A React 19 + Vite + TanStack Router application (empora.aoneahsan.com) that serves:

  • Marketing pages (home, features, pricing, changelog).
  • Documentation and legal pages.
  • A signed-in dashboard to manage your license and connected stores.
  • A set of free client-side utility tools.

A Capacitor wrapper packages this same web build into a mobile app shell (Android/iOS projects are committed; mobile is a thin wrapper around the web experience).

3. The backend API​

A Laravel 12 + Nova 5 application providing:

  • Auth (Sanctum tokens; email/password + Google).
  • License issuance, activation, validation, and deactivation.
  • Subscription and entitlement state — which plan a licence is on, and therefore which modules it unlocks.
  • Update checks for the premium plugin build.
  • Health endpoints for monitoring.

See the REST API and License API references for the concrete endpoints.

Shared packages​

The monorepo also contains shared TypeScript packages — UI primitives, authentication helpers, observability, file-upload and shared types — reused by both the web app and the plugin admin, so the two surfaces behave the same way without duplicating code.

Why a module registry​

The registry pattern is what lets Empora be "all-in-one" without being a monolith: stores enable only what they need, each module is independently testable, and the free/premium split is enforced in one place (entitlements) rather than scattered across the codebase.