How Noviz is built — one relay engine, every ERPNext install
Three diagrams, from three different angles: the components that make up the system,
what happens when a tenant is provisioned or an operator reviews the platform, and the
full path a single chat prompt takes through a customer's own ERPNext and back. Each one
ends the same way — one shared Relay Engine serves every tenant, so a fix made once
reaches every customer's very next turn, with no per-tenant redeploy and no plugin
update required.
Diagrams are wide — scroll horizontally on a narrow screen, or view on a larger one for the full picture at once.
What this shows: a native chat page and a settings screen live inside each tenant's own ERPNext and talk only to one shared Relay over an authenticated session. That Relay — tenant registry and auth, turn state, reasoning, a call translator and role/tenant gateway — is configured entirely by a flat grid of per-module folders (no per-module code inside the engine itself), backed by one shared Postgres database, and reaches exactly one external system by design: an AI Relay Gateway to the model layer, swappable behind one interface. Execution against real ERP data never happens here — it happens back inside the tenant's own ERPNext, under that person's own session, through the Plugin Dispatcher. The band at the bottom is what makes this a platform rather than one static integration per customer: a turn logged from ANY tenant can surface a fix that gets made once, centrally, and reaches every tenant's very next turn — no per-tenant redeploy, no plugin update.
What this shows: two different admins, two different surfaces. A tenant's own admin, inside their own ERPNext, only ever touches flows 1–2: the plugin's connection settings and that tenant's own Company Policy, both just rows the shared Relay re-reads on the next request. Zeetech's side, flows 3–4, is provisioning (a new tenant + API key, never an ERP credential) and review: interactions flagged by a 👎 or a blocked gate, from any tenant, get fixed once, centrally — no separate "admin path" per tenant, no redeploy, just a sharper Relay on the very next turn, for everyone.
What this shows: every hop a single chat turn takes, start to finish — the Relay resolves exactly one tenant, reasons in a loop that can call more than one tool, but every single tool call is reduced to a generic spec and re-checked against tenant tier and that person's real ERPNext role before it's allowed anywhere near the plugin, which then executes it in-process, inside that tenant's own ERPNext, under their own session — never a stored credential, never a network hop to get there. Steps 7–8 are what makes this a platform rather than one static integration per customer: the turn isn't just answered and forgotten, it's logged, and a fix curated from ANY tenant's history rolls back into steps 2–3 for every tenant's next turn — not just the one that hit it first.