# Extension Point API Reference

Use this page when you know what you want to extend and need the exact contract, registration point, and fallback behavior. Start with [Extension point chooser](extension-point-chooser.md) if you are still deciding.

## Reading The Tables

| Column        | Meaning                                                                      |
| ------------- | ---------------------------------------------------------------------------- |
| API           | Contract, registry, facade, or tag to use.                                   |
| Register from | Where package code should usually register it.                               |
| Called by     | Runtime surface that consumes the contribution.                              |
| Safe fallback | What should happen when the package is absent, disabled, or returns nothing. |
| Test recipe   | Smallest useful proof.                                                       |

## Core And Package Runtime

| Need                     | API                                                                 | Register from                                          | Called by                                                     | Safe fallback                         | Test recipe                                                                                                                                              |
| ------------------------ | ------------------------------------------------------------------- | ------------------------------------------------------ | ------------------------------------------------------------- | ------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Page subject type        | `CapellCore::registerPageType(new PageTypeData(...))`               | Runtime provider `registeringPackage()` or boot method | Blueprint/page type selection                                 | Type is absent from selectors         | Assert `CapellCore::getPageTypes()` contains the key.                                                                                                    |
| Model morph alias        | `CapellCore::registerModel()` / `registerModels()`                  | Runtime provider                                       | Morph map and model resolution                                | Laravel default morph behavior        | Assert morph map resolves the model alias.                                                                                                               |
| Model behavior           | `CapellCore::registerModelInterceptor()`                            | Runtime/admin provider                                 | Capell model interceptor resolver                             | Base model behavior remains unchanged | Instantiate model and assert interceptor method affects only matching context.                                                                           |
| Settings schema          | `SettingsSchemaRegistry::register()` plus `registerSettingsClass()` | Runtime/admin provider or AdminBridge                  | Admin settings surfaces                                       | Group/tab is absent                   | Resolve registry and assert schema/settings class for group.                                                                                             |
| Package settings page    | `CapellAdmin::registerExtensionPage()`                              | AdminBridge or admin provider                          | Installed Extensions page and grouped Filament sub-navigation | No package control page               | Assert `ExtensionPageRegistry::get($packageName)` returns the page and the sub-navigation contains accessible registered pages grouped by product group. |
| Content graph extraction | `ContentGraphRegistry::TAG` or registry registration                | Runtime provider                                       | Content graph builders                                        | Content is not linked into graph      | Build graph for fixture content and assert edge exists.                                                                                                  |
| Link picker entries      | `LinkableContentRegistry::register(...)`                            | Runtime/admin provider                                 | Link picker/search UI                                         | Item type is not searchable           | Assert registry includes provider and search returns fixture.                                                                                            |
| Renderable definition    | `RenderableRegistry::register(...)`                                 | Runtime provider                                       | Rendering/runtime builders                                    | Definition is unavailable             | Assert registry returns the definition key.                                                                                                              |
| Tailwind assets          | `TailwindAssetsRegistry::registerSource()` / `registerImport()`     | Runtime/frontend provider                              | Frontend/admin asset commands                                 | Package classes are not scanned       | Assert `toReport()` includes source/import origin.                                                                                                       |
| Vendor asset condition   | `VendorAssetConditionRegistry::register(...)`                       | Runtime provider                                       | Asset manifest builders                                       | Asset is not conditionally loaded     | Assert condition returns expected value for fixture context.                                                                                             |
| Developer maker          | `MakerRegistryInterface::register(...)`                             | Runtime/dev provider                                   | Maker commands                                                | Maker command option is absent        | Assert maker appears in registry.                                                                                                                        |

## Admin Runtime

| Need                               | API                                                                                                   | Register from                       | Called by                       | Safe fallback                         | Test recipe                                                  |
| ---------------------------------- | ----------------------------------------------------------------------------------------------------- | ----------------------------------- | ------------------------------- | ------------------------------------- | ------------------------------------------------------------ |
| Multiple admin surfaces            | `AdminBridge` with `AdminBridgeRegistrar`                                                             | Runtime/admin provider              | Admin bridge registry           | Package contributes no admin surfaces | Assert bridge is registered for package name.                |
| Single admin page/resource/widget  | `CapellAdmin::contributeToAdminSurface(AdminSurfaceContributionData::...)`                            | Admin provider                      | `CapellAdminPlugin`             | Surface is absent                     | Assert admin surface lookup contains the class.              |
| Dashboard widget                   | `CapellAdmin::registerDashboardWidget(...)`                                                           | Admin provider or bridge            | Dashboard widget resolver       | Widget hidden                         | Assert widget appears in expected dashboard slot.            |
| Overview stat                      | `CapellAdmin::registerOverviewStat(...)`                                                              | Admin provider                      | Dashboard stats                 | Stat hidden                           | Assert stat key appears for allowed user/context.            |
| User menu item                     | `CapellAdmin::registerUserMenuItem(...)`                                                              | Admin provider                      | User menu registry              | Menu item hidden                      | Assert user menu registry contains item.                     |
| Admin header tool                  | `AdminToolItem::TAG`                                                                                  | Tag class in provider               | Admin tool registry             | Tool hidden                           | Resolve `app()->tagged(AdminToolItem::TAG)`.                 |
| Page form fields                   | `PageSchemaExtender::TAG`                                                                             | Tag extender in provider or bridge  | Page schema resolver            | Base page form only                   | Build schema for fixture page and assert field exists.       |
| Site form fields                   | `SiteSchemaExtender::TAG`                                                                             | Tag extender in provider or bridge  | Site schema resolver            | Base site form only                   | Build schema for fixture site and assert field exists.       |
| Layout form fields                 | `LayoutSchemaExtender::TAG`                                                                           | Tag extender in provider or bridge  | Layout schema resolver          | Base layout form only                 | Build schema for fixture layout and assert field exists.     |
| User form fields                   | `UserSchemaExtender::TAG`                                                                             | Tag extender or user bridge         | User schema resolver            | Base user form only                   | Assert `supports()` and schema field for target user model.  |
| Page table query                   | `PageTableExtender::TAG`                                                                              | Tag extender in provider            | Page tables and page selects    | Base query                            | Assert modified query includes expected relation/filter.     |
| Page table publish/workflow status | `PageTableStatusResolver` container binding                                                           | Admin provider                      | Pages table status column       | Publish-date status resolver          | Bind a fake resolver and assert the table renders its state. |
| User table query                   | `UserTableExtender::TAG`                                                                              | Tag extender or user bridge         | User resource table             | Base query                            | Assert modified query behavior.                              |
| Header actions                     | `PageHeaderActionExtender::TAG`, `SiteHeaderActionExtender::TAG`, `ResourceHeaderActionExtender::TAG` | Tag extender in provider            | Resource/page action resolvers  | Action hidden                         | Render header actions and assert action key.                 |
| Site row actions                   | `SiteRecordActionExtender::TAG`                                                                       | Tag extender in provider            | Sites table                     | Action hidden                         | Render table actions for fixture site.                       |
| Publish panel content              | `PublishPanelExtender::TAG`                                                                           | Tag extender in provider            | Page publish section            | Panel remains unchanged               | Assert view/html appears only for supported page.            |
| Page edit content                  | `PageEditExtender::TAG`                                                                               | Tag extender in provider            | Edit page                       | Extra content hidden                  | Render edit page and assert component appears.               |
| Page resource pages/widgets        | `PageResourcePageExtender::TAG`, `PageResourceWidgetExtender::TAG`                                    | Tag extender in provider            | Page resource                   | Extra pages/widgets hidden            | Assert `PageResource` includes class.                        |
| Page export fields                 | `PageExportExtender::TAG`                                                                             | Tag extender in provider            | Page/site export actions        | Extra fields omitted                  | Run export action and assert payload contains field.         |
| Media edit actions                 | `MediaEditActionExtender::TAG`                                                                        | Tag extender in provider            | Media edit page                 | Action hidden                         | Render media edit actions.                                   |
| Extensions page content            | `ExtensionsPageExtender::TAG`                                                                         | Tag extender in provider            | Installed Extensions page       | No package alert/content              | Render Extensions page and assert package section.           |
| Extensions page actions            | `ExtensionsPageActionRegistry`                                                                        | `afterResolving()` or provider boot | Installed Extensions page       | Action hidden                         | Resolve registry and assert header/table action key.         |
| Admin panel customization          | `AdminPanelExtender::TAG`                                                                             | Tag extender in provider            | `CapellAdminPlugin`             | Base panel config                     | Build panel and assert plugin/middleware/theme change.       |
| Validation gates                   | `ValidationSubscriber` or subscriber contracts                                                        | Runtime/admin provider              | Subscriber manager/admin events | Validation not applied                | Notify event with fixture and assert error/result.           |
| Admin event handlers               | `AdminEventRegistry::register(...)`                                                                   | Admin provider                      | `HasDynamicEventListeners`      | Event has no extra handler            | Dispatch Livewire event and assert handler ran.              |
| Activity display/revert            | `ActivityChangeSetBuilder::TAG`, `ActivityRevertHandler::TAG`                                         | Admin provider                      | Activity/revert actions         | Default activity behavior             | Run activity builder/revert fixture.                         |
| Site Health report                 | `SiteHealthReportExtender::TAG`                                                                       | Admin provider                      | Site Health action/page         | Report section absent                 | Build Site Health report and assert section.                 |

## Frontend Runtime

| Need                          | API                                                                | Register from                            | Called by                         | Safe fallback                        | Test recipe                                                        |
| ----------------------------- | ------------------------------------------------------------------ | ---------------------------------------- | --------------------------------- | ------------------------------------ | ------------------------------------------------------------------ |
| Small public HTML injection   | `RenderHookRegistry::register(...)`                                | Frontend/runtime provider                | Public Blade hook calls           | Hook outputs nothing                 | Render anonymous page and assert safe HTML.                        |
| Frontend component alias      | `FrontendComponentRegistryInterface::register(...)`                | Frontend provider                        | Runtime component resolver        | Alias is unavailable                 | Assert `has()` and `hasReference()` for key/alias.                 |
| Builder block rendering       | `WidgetRegistry::register(...)` with frontend target               | Runtime/frontend provider                | Content renderer                  | Block is skipped/unrenderable        | Render fixture block and assert output.                            |
| Reserved public path          | `ReservedFrontendPathRegistry::reserveExact()` / `reservePrefix()` | Frontend provider before fallback routes | Frontend route resolver           | Path falls through to page lookup    | Assert package route responds and page fallback does not catch it. |
| Public route middleware       | `FrontendRouteMiddlewareRegistry`                                  | Frontend provider                        | Public page route                 | Base middleware order                | Assert `all()` order or request side effect.                       |
| Frontend rule condition       | `FrontendRuleConditionRegistry::register(...)`                     | Frontend provider                        | Runtime rules                     | Rule never matches                   | Directly evaluate condition against fixture context.               |
| Response renderer             | `FrontendResponseRendererRegistry::register()` / `registerClass()` | Frontend provider                        | Runtime response pipeline         | Default renderer                     | Resolve renderer for runtime and assert response class/content.    |
| Cache invalidation            | `CacheInvalidationRegistry::registerDependency(...)`               | Frontend/runtime provider                | Model observers/cache invalidator | Cache remains until TTL/manual clear | Save fixture model and assert invalidation plan.                   |
| Critical/deferred assets      | `CriticalAssetRegistry::registerCritical()` / `registerDeferred()` | Frontend provider                        | Frontend asset rendering          | Asset not emitted                    | Render page and assert handle/url in expected section.             |
| Runtime manifest contributors | `FrontendRuntimeManifestContributor::TAG`                          | Frontend provider                        | Frontend runtime builder          | Manifest lacks package data          | Build runtime manifest and assert contribution.                    |
| Asset contributors            | `FrontendAssetContributor::TAG`                                    | Frontend provider                        | Frontend asset manifest builder   | Asset absent                         | Build asset manifest and assert package handle.                    |

## Installer And Marketplace Runtime

| Need                                     | API                                                                                                                           | Register from                          | Called by                         | Safe fallback                 | Test recipe                                                                   |
| ---------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- | -------------------------------------- | --------------------------------- | ----------------------------- | ----------------------------------------------------------------------------- |
| Browser install guide patch              | `Patch` plus `PatchRegistry::register(...)`                                                                                   | Installer provider `registerPatches()` | Install guide page/action         | Patch absent                  | Probe/apply fixture host file and assert idempotence.                         |
| Installer default packages               | `CAPELL_SETUP_DEFAULT_PACKAGES` plus package metadata                                                                         | Host env/config                        | Browser installer page data       | Package not preselected       | Build installer page data and assert default list.                            |
| Extension dashboard widget               | `CapellAdmin::registerDashboardWidget($widget, DashboardEnum::Extensions)` or `$registrar->extensionDashboardWidget($widget)` | Admin provider or admin bridge         | Extensions dashboard              | Widget absent                 | Register fixture widget and assert it appears in `DashboardEnum::Extensions`. |
| Marketplace installed extensions content | `ExtensionsPageExtender::TAG`                                                                                                 | Marketplace/provider                   | Extensions dashboard actions area | No Marketplace alert          | Render Extensions page in connected/unconnected states.                       |
| Marketplace theme header action          | `ResourceHeaderActionExtender::TAG`                                                                                           | Marketplace/provider                   | Theme resource header             | Action hidden                 | Render theme resource action list.                                            |
| Marketplace activation verification      | Container binding `capell.marketplace.activation-verifier`                                                                    | Marketplace provider                   | Install/activation flow           | Signed activation unavailable | Resolve binding and verify signed fixture payload.                            |

## Rules

- Register in the package that owns the behavior.
- Return `null`, an empty array, or no-op output when the package does not support the current context.
- Test both the expected contribution and the safe fallback.
- Public frontend extensions must pass [public HTML safety](../frontend/public-html-safety.md).

## Next

- [Build an extension end to end](build-extension-end-to-end.md)
- [Admin extensions](admin-extensions.md)
- [Frontend extensions](frontend-extensions.md)
- [Extension troubleshooting](extension-troubleshooting.md)