/ architecture
A modular monolith on one data spine
Fourteen modules live inside one application and describe themselves: each carries its own manifest, router, services, tests and changelog. Adding a new module is a single line of registration.
Data sources
The plant historian is read read-only; a second data source carries field device data; file and model assets live in object storage.
Shared service layer
Every module reaches data through the same async clients. Response ceilings, sampling and status-code traps are solved in one place — modules do not rediscover them.
Modules
Each module registers with a self-describing manifest; a catalog endpoint feeds the interface. Modules do not reach into one another.
Interface
A single-page application; module routes load lazily and language catalogs are split per module, so the first paint stays light.
Security and compliance
Sign-in through a corporate identity provider; role × group authorization; deny by default. Secrets live in secret management, never in source; encryption in transit and at rest; audit logging for privileged actions; dependency and static security scanning on every release.