Every organization eventually outgrows the "one-size-fits-all" website — they need a native-feeling mobile experience, a custom-built tool specific to how they work, or a connection to an outside system they already rely on. Most platforms force a choice between staying locked into the vendor's box or rebuilding everything from scratch elsewhere.
The pain it solves: Bespoke needs shouldn't mean a completely separate project, a second login, or a second bill from a different vendor.
How it helps:
The happy workday: A new integration or a custom-built tool goes live inside the same workspace staff already know, activated with a toggle rather than a new deployment.
Extensibility without fragmentation is the goal: your mobile experience, your bespoke tools, and your outside integrations all become part of one coherent platform rather than a patchwork of vendors, logins, and support contracts.
Mobile App is configured through AppDash.razor (ExireNexus.Backstage/Components/Editors/MobileApp/AppDash.razor, routed at /editors/app/dash and /editors/app/{ItemId:guid}), which renders menu items inside a device simulator using IMenuItemService and IItemService so changes can be previewed before publishing. Activation is controlled by SettingNames.ModuleMobileApp in the AppCatalog entry for "Mobile App".
Custom Apps and Integrations are both app-bar-gated features (SettingNames.AppBarCustomApps, SettingNames.AppBarIntegrations) rather than activation-gated modules, reflecting that they're extension points rather than commerce-priced features in the current catalog. The Integrations page (ExireNexus.Backstage/Components/Editors/Developer/Integrations.razor, routed at /editors/developer/integrations) surfaces connections to external services and APIs.
A concrete example of an integration already wired into the platform is IWebhookService (ExireNexus.Services/Integrations/Webhooks/WebhookService.cs): SendMessageAsync and SendPayloadAsync post messages/payloads to a configured webhook URL (resolved per-tenant via ISettingsService), giving the platform a simple, reusable pattern for pushing events to outside systems without hardcoding a specific vendor.
Paid-module gating is enforced centrally by ModuleGateLayout (ExireNexus.Backstage/Components/Layout/ModuleGateLayout.razor), which maps route prefixes (e.g. /editors/app/ → ModuleMobileApp) to their activation setting and blocks direct navigation to a module's pages with a FeatureNotActivated panel when the tenant hasn't activated it — closing the gap between "hidden from the app bar" and "actually inaccessible" that a simple UI-only toggle would leave open.