Developer Guide
Callora is a domain-neutral plugin platform for .NET 10 — "our own Shopware/Symfony, for .NET". The host is a pure platform: authentication and RBAC, user and plugin management, a business-event bus, and the dynamic plugin-routing surface. Everything domain-specific — voice, dialing, contact-center flows, custom UI — lives in plugins.
This guide is for the developer building those plugins.
What you build
A Callora plugin is a normal .NET assembly (plus, optionally, colocated Vue front-end bundles) that ships with a registry.json manifest. It loads into the running host on a collectible AssemblyLoadContext, can be installed and activated without a host restart, and extends the platform through a small set of sanctioned mechanisms.
The extension surface at a glance
| Surface | Mechanism | Marker / contract | Guide |
|---|---|---|---|
| React to platform activity | Business-event listeners (mutable / cancelable) | IBusinessEventListener | Events & Jobs |
| Change platform behavior | Service decoration (per-call proxy) | IServiceDecorator<TService>, [CalloraExtensible(Decoratable)] | Backend Extensions |
| Expose HTTP APIs | Plugin controllers on dynamic routes | AdminApiController / WorkspaceApiController, [CalloraRoute] | Backend Extensions |
| Own data | Custom EF Core entities in an isolated plugin_<id> schema | IPluginDbContextFactory<TContext> | Backend Extensions |
| Run background work | Leased jobs with idempotency and fencing | IBackgroundJobHandler | Events & Jobs |
| Gate features | Capabilities and entitlements (provenance-sourced) | registry.json capabilities, PluginEntitlement | Capabilities & Entitlements |
| Extend the admin shell | Slots, hooks, service overrides | window.CalloraAdmin | Admin Extensions |
| Extend tenant-facing surfaces | Vue views into SSR output | @callora/surface | Surface Extensions |
For the complete, always-current catalog of every sanctioned extension point — grouped by mode (contribute / decorate / replace) — see the Extension Points Reference. It is verified against the platform source by a build test, so it never falls behind the code.
Trust and governance in one sentence
Plugins run in-process and fully trusted — .NET has no supported in-process sandbox (ADR-013) — so safety comes from provenance (signing + curation) and from compile-time governance (the CAL0001–CAL0004 Roslyn analyzers plus a PublicAPI baseline), not from a runtime cage. Read Architecture before writing your first plugin.
Where to start
- Build your first plugin — the end-to-end walkthrough: scaffold, add an endpoint, install, activate, call it.
- Architecture — the platform model, the ALC runtime, the governance boundary.
- Plugin Fundamentals — the entry class,
registry.json, the curated context, exporting extensions, configuration, dependencies. - Backend Extensions — events, decoration, controllers, data.
- Surface Extensions and Admin Extensions — the two front-end runtimes.
- Capabilities & Entitlements and Events & Jobs.
- Testing & Publishing — the test stack, the PublicAPI workflow, publishing a signed plugin.
The generated type reference for the host and first-party plugins lives under API Reference.
License model: Callora is Apache-2.0 — the platform, the analyzers, the CLI and the
@callora/*packages alike. A plugin you build against it may carry any license you like, including a proprietary one; Apache-2.0 asks nothing of it.