Skip to content

Extension Point Chooser

Use this page before adding a hook, service provider call, or package integration. Start with the table that matches the runtime you are changing, then follow the linked page for the full contract and examples.

Use container tags for focused contributors and AdminBridgeRegistrar when one package owns a grouped or context-aware admin integration. The registry is an internal read model; package providers write through the registrar or their surface() helper. Provider lifecycle and lifetime rules are documented in Package provider conventions.

If you are not sure which runtime you are changing, start with Package authoring jobs and Extension surface vocabulary. Those pages define the package surfaces and install-impact terms used by this chooser.

Need Use Owner
Register a page subject type CapellCore::registerPageType(new PageTypeData(...)) Core
Replace a core model implementation Laravel container binding for the model class Core
Register renderable definitions RenderableRegistry::register(...) Core
Register link picker/search options LinkableContentRegistry::register(...) Core
Register content graph extractors ContentGraphRegistry::register(...) or ContentGraphRegistry::TAG Core
Add package settings Provider surface() or AdminBridgeRegistrar Core/Admin
Add package settings migrations database/settings/* plus package install/setup registration Core
Add developer-tooling makers MakerRegistryInterface::register(...) Core
Load vendor build assets conditionally VendorAssetConditionRegistry::register(...) Core/Frontend
Add static export files StaticSiteExtensionRegistry::register(...) Static export package
Extend ownership/export mapping OwnershipMap::register(...) Migration Assistant
Need Use Owner
Add admin resources, pages, widgets, configurators, user menu items, settings, or extenders from one package AdminBridge and AdminBridgeRegistrar Admin
Add one small admin surface CapellAdmin::contributeToAdminSurface(AdminSurfaceContributionData::...) Admin
Register a package settings/control page on Extensions CapellAdmin::registerExtensionPage(...) Admin
Add dashboard Filament widgets CapellAdmin::registerDashboardFilamentWidget(...) Admin
Add small dashboard metrics CapellAdmin::registerOverviewStat(...) Admin
Replace the dashboard page AdminBridgeRegistrar::dashboardPage(...) or CapellAdmin::useDashboardPage(...) Admin
Add user menu actions CapellAdmin::registerUserMenuItem(...) Admin
Add admin header tools Tag an AdminToolItem with AdminToolItem::TAG Admin
Add welcome tour steps CapellAdmin::registerWelcomeTourStep(...) Admin
Add navigation groups CapellAdmin::registerNavigationGroup(...) Admin
Add content widgets CapellAdmin::registerWidget(...) or registerDiscoverableWidgets(...) Admin
Add fields to page, site, layout, or user forms Tagged schema extenders such as PageSchemaExtender::TAG Admin
Add page/site/resource header actions Tagged action extenders such as PageHeaderActionExtender::TAG Admin
Modify page, user, or resource tables Tagged table extenders such as PageTableExtender::TAG Admin
Extend the installed Extensions page ExtensionsPageActionRegistry or ExtensionsPageExtender::TAG Admin
Subscribe to admin serving events CapellAdmin::serving(...) Admin
Register activity resource links/display/revert behavior CapellAdmin::registerActivityResourceLink(...), ActivityChangeSetBuilder::TAG, and ActivityRevertHandler::TAG Admin
Need Use Owner
Inject small public HTML RenderHookRegistry::register(...) Frontend
Add public widgets LayoutWidgetRegistry::register(...) with a frontend target Frontend/Core
Register frontend component aliases FrontendComponentRegistry::register(...) Frontend
Register package CSS or JS sources TailwindAssetsRegistry::registerSource() / registerImport() Core/Frontend
Register runtime frontend assets FrontendResourceRegistry groups / FrontendResourceContributor::TAG Frontend
Reserve package-owned public paths ReservedFrontendPathRegistry::reserveExact() / reservePrefix() Frontend
Add middleware to the public page route FrontendRouteMiddlewareRegistry Frontend
Add frontend rule conditions FrontendRuleConditionRegistry::register(...) Frontend
Replace response rendering for a runtime FrontendResponseRendererRegistry::register(...) / registerClass(...) Frontend
Invalidate pages when a model changes CacheInvalidationRegistry::registerDependency(...) Frontend
  • Prefer an existing extension point over patching host package classes.
  • Keep package feature logic in the package. Host packages should expose contracts, not product behavior.
  • Put writes in Actions and structured state in Data objects.
  • Keep visible strings in translations.
  • Public output must pass the public HTML safety contract.
  • Register most extension points from bootInstalledPackage() unless the contract explicitly belongs in discovery/bootstrap or must bind something in register().