Current Extension Surfaces
Below is the current-state inventory of extension surfaces in Open Saasframe.
Module contracts and auto-discovery
| Surface | How to start | Primary contract/docs |
|---|---|---|
| Module metadata and boot hooks | Add src/modules/<module>/index.ts, then optional di.ts, setup.ts, acl.ts | Modules overview, Container |
| Routes and pages discovery | Add files under api/, backend/, frontend/ in module root | Routes and pages, API modules |
| CLI commands | Add cli.ts in module and export command handlers | CLI overview |
| OpenAPI participation | Export openApi from API handlers | API development guide |
API and mutation extension
| Surface | How to start | Primary contract/docs |
|---|---|---|
| CRUD extension points | Use makeCrudRoute with validators/hooks | CRUD factory |
Multi-ID list filtering (ids) | Call any CRUD list endpoint with ?ids=<uuid1,uuid2,...>; combine with interceptors for cross-module narrowing | CRUD factory, API extension guide |
| API interceptors (UMES E) | Add api/interceptors.ts, export interceptors | API extension guide |
| Response enrichers (UMES D) | Add data/enrichers.ts, export enrichers | Data extensibility |
| Query-level enrichers (UMES N) | Add queryEngine: { enabled: true } to enricher config | Query engine extensibility |
| Mutation guards (UMES M) | Add data/guards.ts, export guards: MutationGuard[] with priority ordering, payload modification, afterSuccess callbacks | API extension guide |
| Command handlers | Register commands with registerCommand | Commands overview |
| Command interceptors (UMES M) | Add commands/interceptors.ts, export interceptors with beforeExecute/afterExecute hooks | Commands overview |
UI extension
| Surface | How to start | Primary contract/docs |
|---|---|---|
| Widget injection (classic) | Add widgets under widgets/injection/* + widgets/injection-table.ts | Widget injection |
| Headless DataTable injections (UMES F) | Inject columns, row actions, bulk actions, filters via injection widgets | Data grids, Widget injection |
| CrudForm field injections (UMES G) | Inject fields/widgets into form groups via injection spots | Crud form, Widget injection |
| Menu injection (UMES B) | Inject menu entries into sidebar/topbar/profile surfaces | Widget injection |
| Component replacement (UMES H) | Add widgets/components.ts, export componentOverrides | Widget injection |
| Integration wizard widget (UMES L) | Use InjectionWizard for multi-step integration onboarding | Widget injection, Integration enhancements |
| Status badge injection (UMES L) | Use StatusBadgeRenderer for service health display | Widget injection, Integration enhancements |
| Provider-scoped integration detail widgets (UMES L) | Declare detailPage.widgetSpotId in IntegrationDefinition, then inject widgets with tab / group / stack placement kinds | Integration enhancements, Integrations & data sync |
| Client-side event filtering (UMES M) | Set filter.operations on widget eventHandlers to scope handlers by operation type | Widget injection |
Events, subscribers, workers
| Surface | How to start | Primary contract/docs |
|---|---|---|
| Typed module events | Add events.ts with createModuleEvents | Events overview |
| DOM Event Bridge + realtime UI (UMES C) | Mark events clientBroadcast: true, consume with useAppEvent / useOperationProgress | Widget injection, Events & queue |
| Async subscribers | Add subscribers/*.ts + metadata | Events overview |
| Sync lifecycle subscribers (UMES M) | Add subscribers/*.ts with metadata { sync: true, priority } for in-pipeline CRUD lifecycle events | Events overview |
| Sync query lifecycle events (UMES N) | Subscribe to *.querying / *.queried events to modify queries or results | Query engine extensibility |
| Queue workers | Add workers/*.ts + worker metadata | Queue workers, Runtime workers |
Data model and entity extension
| Surface | How to start | Primary contract/docs |
|---|---|---|
| Custom entities + custom fields | Add/update ce.ts with field DSL helpers | Custom entities, Data extensibility |
| Cross-module entity extensions | Add data/extensions.ts for module links | Data extensibility |
| Translation fields | Add translations.ts for translatable entity fields | Modules configs |
| Query/index coverage | Use CRUD indexer integration and query-index tooling | Query index |
| External ID mapping enricher (UMES L) | Add data/enrichers.ts with SyncExternalIdMapping entity | Data extensibility, Integration enhancements |
Search, vector, cache, AI
| Surface | How to start | Primary contract/docs |
|---|---|---|
| Search module config | Add search.ts and declare indexed entities/strategies | Hybrid search |
| Fulltext driver extension | Implement FullTextSearchDriver and wire into strategy | Hybrid search |
| Vector entity config | Declare vector config (vector.ts) with buildSource/presenter/links | Hybrid search |
| Vector DB backends (current set) | Use built-in driver IDs: pgvector, qdrant, chromadb | Hybrid search |
| Cache backends | Configure cache strategy (memory, redis, sqlite, jsonfile) | Cache management |
| AI tools (MCP) | Add ai-tools.ts, register tools via ai-assistant contracts | AI assistant package guide |
| AI agents and tool packs | Add ai-agents.ts at module root; define tools with defineAiTool (packs: search, attachments, meta, customers, catalog) | AI Agents, AI Framework Overview |
<AiChat> embed injection | Render <AiChat agent="module.agent_id"> on backend pages; forwards pageContext into the dispatcher | AI Agents, Mutation Approvals |
Notifications, messages, and domain integrations
| Surface | How to start | Primary contract/docs |
|---|---|---|
| Notification type registry | Add notifications.ts and export notificationTypes | Notifications |
| Notification renderers | Add notifications.client.ts for client rendering | Notifications |
| Reactive notification handlers | Add notifications.handlers.ts and export notificationHandlers; react via useNotificationEffect | Notifications, Widget injection |
| Message types | Add message-types.ts in your module | Messages system |
| Message object types | Add message-objects.ts for attachable domain objects | Messages system |
| Payment/shipping providers | Register registerPaymentProvider / registerShippingProvider | Shipping & payment providers, Sales calculations |
| Currency providers | Add custom rate provider implementations | Currencies module |
| Workflow integrations | Add custom workflow activities/signals/subscribers | Workflows extending |
| Integration registry (UMES L) | Use registerIntegration() for typed integration definitions | Integration enhancements, Data extensibility |
What else is extendable right now
- RBAC features (
acl.ts) and role defaults (setup.ts) - Feature toggles for runtime behavior control
- Dashboard widgets and sidebar menu composition
- Scheduler jobs and automation-like recurring tasks (via scheduler module)
See: RBAC, Feature toggles, Scheduler