From ee96a269f8fc2375f1890d12f94f53a2a231369e Mon Sep 17 00:00:00 2001 From: Luuk Peters Date: Mon, 1 Sep 2025 17:11:28 +0200 Subject: [PATCH 01/32] First draft of extension manifest done --- 16/umbraco-cms/.gitbook.yaml | 1 + .../extension-registry/README.md | 14 +++-- .../extension-registry/extension-manifest.md | 53 +++++++++++-------- ...ion-registry.md => register-extensions.md} | 2 +- 4 files changed, 38 insertions(+), 32 deletions(-) rename 16/umbraco-cms/customizing/extending-overview/extension-registry/{extension-registry.md => register-extensions.md} (99%) diff --git a/16/umbraco-cms/.gitbook.yaml b/16/umbraco-cms/.gitbook.yaml index fbae79d113e..0683e8964e1 100644 --- a/16/umbraco-cms/.gitbook.yaml +++ b/16/umbraco-cms/.gitbook.yaml @@ -145,3 +145,4 @@ redirects: extending/customize-backoffice: customizing/README.md extending/content-apps: customizing/extending-overview/extension-types/workspaces/workspace-views.md extending/backoffice-setup/extension-types: customizing/extending-overview/extension-types/README.md + customizing/extending-overview/extension-registry/extension-registry: customizing/extending-overview/extension-registry/register-extensions.md diff --git a/16/umbraco-cms/customizing/extending-overview/extension-registry/README.md b/16/umbraco-cms/customizing/extending-overview/extension-registry/README.md index 60e5dcab6f7..825d410d9f4 100644 --- a/16/umbraco-cms/customizing/extending-overview/extension-registry/README.md +++ b/16/umbraco-cms/customizing/extending-overview/extension-registry/README.md @@ -5,17 +5,15 @@ description: >- --- # Extension Registry +The Umbraco backoffice is build with extendability in mind. The backoffice without extensions is more or less a blank canvas that is build out using extensions. These extensions dictate how the backoffice functions and looks. All visual elements in an Umbraco installation, like the sections, menu's, trees and buttons, are extensions. But extensions also dictate behaviour and the editing experience. So everything in the backoffice is governed (and extendable) by extensions. -The Extensions Registry is your entry to extend or customize the Backoffice. Therefore, it is crucial to understand the abilities of the Extension Registry. +All extensions are registered in the extension registry. The registry can be manipulated at any time, meaning you can add or remove extensions at runtime. You as a developer have the same possibilities as an Umbraco HQ developer, which means what HQ can do, you can do. This also means that you can change almost everything that is by default present in Umbraco. You can see in the backoffice what extensions are registered by going to Settings > Extensions Insights. -## [Extension Registration](extension-registry.md) +## [Introduction to a Extension Manifest](extension-manifest.md) +An Extension Manifest is a declaration on what you want to register in the Umbraco backoffice. This handles what an extension manifest looks like and what is required or not. +## [Register an extension](extension-registry.md) The extension registry is a global registry that can be accessed and changed at any time while Backoffice is running. -## [Extension Manifest](extension-manifest.md) - -Each Extension Manifest has to declare its type. This is used to determine where it hooks into the system. It also looks at what data is required to declare within it. - -## [Replace, Exclude, or Unregister](replace-exclude-or-unregister.md) - +## [Change an existing extension](replace-exclude-or-unregister.md) Once you understand how to declare your own, you may want to replace or remove existing ones. diff --git a/16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md b/16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md index 3a5bf0f8093..b2028a3b496 100644 --- a/16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md +++ b/16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md @@ -3,45 +3,52 @@ description: Learn about the different methods for declaring an Extension Manife --- # Extension Manifest +This page explains how to author Extension Manifests for Umbraco backoffice extensions. +It outlines the manifest structure, required fields, and optional features used across types. -The Extension Manifest is the first step for any extension. It is the declaration of what you want to register. - -In this section, you will find all the Extension Types provided by the Backoffice. [See all Extension Types here.](../extension-types/) +## What is an Extension Manifest? +An Extension Manifest declares a single backoffice extension and its configuration. +Umbraco reads the manifest to register the extension in the Extension Registry. +The chosen extension type determines required fields and available capabilities. +Some extensions need extra assets, like a JavaScript file with a Web Component. ## Extension Manifest Format +An Extension Manifest has a strict format where some properties are required and some depend on the Extension Type. An Extension Manifest can be written as a JavaScript or JSON Object. We'll dive deeper into that when [registering an extension](extension-registry). -An Extension Manifest can be written as a JavaScript or JSON Object. +The abilities of the extensions rely on the specific extension type. The Type sets the scene for what the extension can do and what it needs to be utilized. Some extension types can be made purely via the manifest, like a section or menu item. Other types require files, like a JavaScript file containing a Web Component, like a custom property editor. -The abilities of the extensions rely on the specific extension type. The Type sets the scene for what the extension can do and what it needs to be utilized. Some extension types can be made purely via the manifest. Other types require files, like a JavaScript file containing a Web Component. +### Required Manifest properties +A minimal Extension Manifest looks like this (in JSON formatting): -```typescript +```json { - type: '...', - alias: 'my.customization', - name: 'My customization' - ... -}; + "type": "...", + "alias": "my.customization", + "name": "My customization" +} ``` -The required fields of any Extension Manifest are: +These fields are all required and have the following meaning: -* `type` — The type defines the purpose of the extension. It is used to determine where the extension will be used. -* `alias` — This is a unique identifier for this manifest. Prefix it with something that makes your extension unique. Example: `mfc.Dashboard.Overview` . -* `name` — This is a representational name of this manifest; It does not need to be unique, but this can be beneficial when debugging extensions. Example: `My Fictive Company Overview Dashboar` . - -### Additional Manifest features +* `type` — The type defines the purpose of the extension. Umbraco has many [extension types](../extension-types) available. +* `alias` — This is a unique identifier for this manifest. Prefix it with something that makes your extension unique. For example: _FictiveCompany.MyProject.Dashboard.Overview_. +* `name` — This is a representational name of this manifest; It does not need to be unique, but this can be beneficial when debugging extensions. This name also shows up in the Extensions Insights in the backoffice of Umbraco. For example: _My Fictive Company Overview Dashboard_. +### Additional Manifest properties Most extension types support the use of the following generic features for their Manifest: -* `weight` - Define a weight to determine the importance or visual order of this extension. A higher weight gives a more prominent position. -* `overwrites` - Define one or more Extension Aliases that this extension should replace. Notice it only omits the listed Extensions when this is rendered in the same spot. [Read more in Replace, Exclude or Unregister](replace-exclude-or-unregister.md). -* `conditions` - Define one or more conditions that must be permitted for the extension to become available. [Extension Conditions](../extension-conditions.md). -* `kind` - Define a kind-alias of which this manifest should be based upon. Kind acts like a preset for your manifest. [Extension Kinds](../extension-kind.md). +* `weight` - Define a weight to determine the importance or visual order of this extension. A higher weight gives a more prominent position. For instance, for a dashboard it determines it's order between other dashboards. +* `overwrites` - If replacing an existing extension, this define one or more Extension Aliases that this extension should replace. Read more in [Replace, Exclude or Unregister extensions](replace-exclude-or-unregister.md). +* `conditions` - Define one or more conditions that must pass for the extension to become available. For instance, don't show a section if you don't have the proper rights. Read more in [Extension Conditions](../extension-conditions.md). +* `kind` - Some extension types can reference a predefined Kind. By specifying a Kind, the manifest inherits the Kind's properties. This allows for reuse of predefined settings. See [Extension Kind](../extension-kind.md). +* `meta` - Many Extension Types require additional information declared as part of a `meta` field. It depends on the extension what is required. For instance label and icon of a menu item. -Many of the Extension Types require additional information declared as part of a `meta` field. +For more information, see an overview of all possible [Extension Types](../extension-types/) and their requirements. -## Type intellisense +---- Below should be moved or removed, because it requires too much context for this file ----- + +## Type intellisense It is recommended to make use of the Type IntelliSense that we provide. When writing your Manifest in TypeScript, you should use the Type `UmbExtensionManifest`. See the article on [Development Setup](../../development-flow/) to ensure you have Types correctly configured. diff --git a/16/umbraco-cms/customizing/extending-overview/extension-registry/extension-registry.md b/16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md similarity index 99% rename from 16/umbraco-cms/customizing/extending-overview/extension-registry/extension-registry.md rename to 16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md index ab9cf37dc89..230d295e2d3 100644 --- a/16/umbraco-cms/customizing/extending-overview/extension-registry/extension-registry.md +++ b/16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md @@ -4,7 +4,7 @@ description: >- registering an Extension via an Extension Manifest. --- -# Register an Extension +# Register extensions Whether you're looking to make a single correction or a package, it is done via a file on the server that we call Umbraco Package JSON. This will be your starting point. From a161af8ab7dc22f63b5fcb7efcd522bb032c165f Mon Sep 17 00:00:00 2001 From: Luuk Peters Date: Fri, 26 Sep 2025 09:48:33 +0200 Subject: [PATCH 02/32] First draft done --- .../extension-registry/README.md | 10 ++- .../extension-registry/extension-manifest.md | 7 +- .../extension-registry/register-extensions.md | 74 +++++++++++++------ .../replace-exclude-or-unregister.md | 24 +++--- 4 files changed, 77 insertions(+), 38 deletions(-) diff --git a/16/umbraco-cms/customizing/extending-overview/extension-registry/README.md b/16/umbraco-cms/customizing/extending-overview/extension-registry/README.md index 825d410d9f4..ef1b02f6ce4 100644 --- a/16/umbraco-cms/customizing/extending-overview/extension-registry/README.md +++ b/16/umbraco-cms/customizing/extending-overview/extension-registry/README.md @@ -7,13 +7,17 @@ description: >- # Extension Registry The Umbraco backoffice is build with extendability in mind. The backoffice without extensions is more or less a blank canvas that is build out using extensions. These extensions dictate how the backoffice functions and looks. All visual elements in an Umbraco installation, like the sections, menu's, trees and buttons, are extensions. But extensions also dictate behaviour and the editing experience. So everything in the backoffice is governed (and extendable) by extensions. -All extensions are registered in the extension registry. The registry can be manipulated at any time, meaning you can add or remove extensions at runtime. You as a developer have the same possibilities as an Umbraco HQ developer, which means what HQ can do, you can do. This also means that you can change almost everything that is by default present in Umbraco. You can see in the backoffice what extensions are registered by going to Settings > Extensions Insights. +{% hint style="info" %} +You can see in the backoffice what extensions are registered and to go to Settings > Extensions Insights. +{% endhint %} + +All extensions are registered in the extension registry. The registry can be manipulated at any time, meaning you can add or remove extensions at runtime. You as a developer have the same possibilities as an Umbraco HQ developer, which means what HQ can do, you can do. This also means that you can change almost everything that is by default present in Umbraco. ## [Introduction to a Extension Manifest](extension-manifest.md) -An Extension Manifest is a declaration on what you want to register in the Umbraco backoffice. This handles what an extension manifest looks like and what is required or not. +An Extension Manifest is a declaration on what you want to register in the Umbraco backoffice. This articles handles what an extension manifest looks like and what is required or not. ## [Register an extension](extension-registry.md) -The extension registry is a global registry that can be accessed and changed at any time while Backoffice is running. +This article handles how to register an extension using an umbraco-package.json file. ## [Change an existing extension](replace-exclude-or-unregister.md) Once you understand how to declare your own, you may want to replace or remove existing ones. diff --git a/16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md b/16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md index b2028a3b496..df9a18884ab 100644 --- a/16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md +++ b/16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md @@ -3,13 +3,12 @@ description: Learn about the different methods for declaring an Extension Manife --- # Extension Manifest -This page explains how to author Extension Manifests for Umbraco backoffice extensions. -It outlines the manifest structure, required fields, and optional features used across types. +This page explains what an Extension Manifests for Umbraco backoffice extensions is. It outlines the manifest structure, required fields, and optional features used across types. ## What is an Extension Manifest? An Extension Manifest declares a single backoffice extension and its configuration. Umbraco reads the manifest to register the extension in the Extension Registry. -The chosen extension type determines required fields and available capabilities. +Each extension is of a certain type and this determines the required fields of the manifest and its available capabilities. Some extensions need extra assets, like a JavaScript file with a Web Component. ## Extension Manifest Format @@ -18,7 +17,7 @@ An Extension Manifest has a strict format where some properties are required and The abilities of the extensions rely on the specific extension type. The Type sets the scene for what the extension can do and what it needs to be utilized. Some extension types can be made purely via the manifest, like a section or menu item. Other types require files, like a JavaScript file containing a Web Component, like a custom property editor. ### Required Manifest properties -A minimal Extension Manifest looks like this (in JSON formatting): +A minimal Extension Manifest looks like this: ```json { diff --git a/16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md b/16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md index 230d295e2d3..833730635e8 100644 --- a/16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md +++ b/16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md @@ -5,30 +5,35 @@ description: >- --- # Register extensions - -Whether you're looking to make a single correction or a package, it is done via a file on the server that we call Umbraco Package JSON. This will be your starting point. +Whether you're looking to make extensions in the context of an Umbraco project or a package, you always need a specific JSON file for this, the umbraco-package.json file. This is the starting point of any extension. ## Umbraco-package.json +To get extensions registered in Umbraco, you need to have an `umbraco-package.json` file. This file needs to be located in `wwwroot/App_Plugins/#YOUR_EXTENSION_NAME#`. Umbraco scans for these files on boot and reads the [`extension manifests`](extension-manifest.md) that are present in the file to register the extensions. -In this file, you declare a name for the Package and declare one or more [`extension manifests`](extension-manifest.md). +{% hint style="info" %} +Even though the file is called umbraco-package.json and even though it will be displayed in the 'installed packages' overview in the backoffice, it does not mean that extensions can only work in the context of a package. +{% endhint %} +{% code title="umbraco-package.json" %} ```json { "name": "My Customizations", "extensions": [ { "type": "...", - "alias": "my.customization", - "name": "My customization" + "alias": "my.customization.extension1", + "name": "My customization extension 1" ... }, ... ] } ``` +{% endcode %} When writing the Umbraco Package Manifest, you can use the JSON Schema located in the root of your Umbraco project. The file is called `umbraco-package-schema.json` +{% code title="umbraco-package.json" %} ```json { "$schema": "../../umbraco-package-schema.json", @@ -38,30 +43,55 @@ When writing the Umbraco Package Manifest, you can use the JSON Schema located i ] } ``` +{% endcode %} -## Declare Extensions in JavaScript/TypeScript - -Are you looking for as much help as you can get, or to make a bigger project? Then it's recommended to spend the time setting up a TypeScript Project for your Customizations. [Read more about Development Setups here](../../development-flow/). - -TypeScript gives IntelliSense for everything, acting as documentation. - -The following example demonstrates how you can configure your `umbraco-package.json` file to point to a single JavaScript/TypeScript file that declares all your Manifests. - -There are two approaches for declaring Manifests in JavaScript/TypeScript. Read more about each option: +There are two additional properties that are not required, but can be useful: -### [The Bundle approach](../extension-types/bundle.md) +* `id` - a unique identifier of the package. If you are creating a NuGet package, use that as the id. +* `version` - the version of the package that is displayed in the backoffice in the overview of installed packages. This is also used for package migrations. -The Bundle is an Extension that declares one or more Extension Manifests. +This is an example of a full umbraco-package.json that registers two localization extensions: -### [The Entry Point approach](../extension-types/backoffice-entry-point.md) +```json +{ + "$schema": "../../umbraco-package-schema.json", + "id": "MyCustomizations", + "name": "My Customizations", + "version": "16.0.0", + "extensions": [ + { + "type": "localization", + "alias": "MyCustomizations.Localize.EnUS", + "name": "English", + "meta": { + "culture": "en" + }, + "js": "/App_Plugins/MyCustomizations/localization/en.js" + }, + { + "type": "localization", + "alias": "MyCustomizations.Localize.NlNl", + "name": "Danish", + "meta": { + "culture": "dk" + }, + "js": "/App_Plugins/MyCustomizations/localization/dk.js" + } + ] +} +``` -The Entry Point is an Extension that executes a method on startup. This can be used for different tasks, such as performing initial configuration and registering other Extension Manifests. +## Advanced registration +### The bundle approach +Instead of registering each manifest in the `umbraco-package.json` you can have multiple manifests and build them into a bundle. You then register this bundle in a single `bundle` extension. In larger projects with a lot of extensions, this allows you to keep your umbraco-package.json file leaner. Read more in the [bundle approach](../extension-types/bundle.md). -### Registration via any JavaScript code +### The entry point approach +The Entry Point is an Extension that executes a method on startup. This can be used for different tasks, such as performing initial configuration and registering other Extension Manifests. Read more in [the entry point approach](../extension-types/backoffice-entry-point.md). -Once you have running code, you can declare an Extension Manifest at any given point. +### Registration with JavaScript on the fly +In some cases, extensions are not static and cannot be registered in the umbraco-package.json or in a bundle. For instance, your manifest gets defined based on information from the server. Or you can even generate the manifests server side based on data in the database. In that case, you need to register extensions on the fly. -It's not a recommended approach, but for some cases, you may like to register and unregister Extensions on the fly. The following example shows how to register an extension manifest via JavaScript/TypeScript code: +The following example shows how to register an extension manifest via JavaScript/TypeScript code: ```typescript import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; @@ -73,3 +103,5 @@ const manifest = { umbExtensionsRegistry.register(extension); ``` + +When and where to execute this code is up to you and depending on your situation. But in a lot of cases, it makes sense to execute this on boot, using the [the entry point approach](../extension-types/backoffice-entry-point.md). diff --git a/16/umbraco-cms/customizing/extending-overview/extension-registry/replace-exclude-or-unregister.md b/16/umbraco-cms/customizing/extending-overview/extension-registry/replace-exclude-or-unregister.md index 0fded461712..cf4650f0b04 100644 --- a/16/umbraco-cms/customizing/extending-overview/extension-registry/replace-exclude-or-unregister.md +++ b/16/umbraco-cms/customizing/extending-overview/extension-registry/replace-exclude-or-unregister.md @@ -5,14 +5,15 @@ description: >- --- # Replace, Exclude or Unregister +Besides adding extensions to Umbraco, sometimes you want to change what's already there. You can replace extensions with your own and exclude or unregister extensions. ## Replace +You can have an extension that replaces another extension. +This can be done by defining `overwrites` of your [manifest](extension-manifest.md) with one Extension-alias or an array of Extension-aliases that need to be replaced. -If you want to bring your own extension and remove an existing, define your Extension to replace one or more other Extensions. -This can be done by defining `overwrites` of your manifest with one Extension-alias or an array of Extension-aliases. [Read more about the Manifest Declaration here.](extension-manifest.md) -Overwrite a single extension: +This example overrides the save and preview button with an external preview button (single overwrite): ```typescript const manifest = { @@ -24,7 +25,7 @@ const manifest = { }; ``` -Overwrite multiple extensions: +This example overrides both the save and preview button as well as the save button with an external preview button (multiple overwrite): ```typescript const manifest = { @@ -36,13 +37,14 @@ const manifest = { }; ``` -Once your extension is displayed in the same spot as the one defined in `overwrites`, those will be hidden. - If your extension has conditions, then the overwrites will only be hidden when your extension is displayed. This means that the overwrites only have an effect if all the conditions are permitted and the extensions are displayed at the same spot. ## Exclude +When you exclude an extension, the extension will never be displayed. This allows for permanently hiding for example a menu or a button. This does not unregister the extensions, but rather flags it as excluded. This also means that no-one else can register an extension with the same alias as the excluded extension. -To make an extension go away completely, you should exclude it. This approach secures that the extension will never be presented. +{% hint style="warning" %} +Currently, it's not possible to un-exclude extensions once excluded. +{% endhint %} The following JavaScript code hides the `Save and Preview` button from the Document Workspace. @@ -51,10 +53,12 @@ import { UmbExtensionRegistry } from '@umbraco-cms/backoffice/extension-api'; UmbExtensionRegistry.exclude('Umb.WorkspaceAction.Document.SaveAndPreview'); ``` +When and where to execute this code is up to you and depending on your situation. But in a lot of cases, it makes sense to execute this on boot, using the [the entry point approach](../extension-types/backoffice-entry-point.md). ## Unregister +You can also choose to unregister an extension. It's recommended to only use this of on extension you registered yourself and have control over. Otherwise you might try to remove an extension before it's registered. A use case for this is if you temporarily registered an extension and you like to remove it again. -You can also choose to unregister an extension, this is only preferred if you registered the extension and are in control of the flow. If it's not your Extension please seek to use the `Overwrites` or `Exclude` feature. +In other cases you can use the `overwrites` or `exclude` option. The difference with the `exclude` approach, is that unregistering removes the extension from the extension registry. This allows for re-registering extensions with the same alias. ```typescript import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; @@ -62,6 +66,6 @@ import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registr umbExtensionsRegistry.unregister('My.WorkspaceAction.AutoFillWithUnicorns'); ``` -This will not prevent the Extension from being registered again. +When and where to execute this code is up to you and depending on your situation. But in a lot of cases, it makes sense to execute this on boot, using the [the entry point approach](../extension-types/backoffice-entry-point.md). + -A use case for this is if you temporarily registered an extension and you like to remove it again. From a30284b61c58f616ff9a1e7db1865c0aedec31fb Mon Sep 17 00:00:00 2001 From: Luuk Peters Date: Fri, 26 Sep 2025 10:10:16 +0200 Subject: [PATCH 03/32] Spelling and grammar checked --- .../extension-registry/extension-manifest.md | 50 ++----------------- .../extension-registry/register-extensions.md | 42 +++++++++------- .../replace-exclude-or-unregister.md | 29 +++++++---- 3 files changed, 50 insertions(+), 71 deletions(-) diff --git a/16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md b/16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md index df9a18884ab..8b3debabee0 100644 --- a/16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md +++ b/16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md @@ -6,16 +6,16 @@ description: Learn about the different methods for declaring an Extension Manife This page explains what an Extension Manifests for Umbraco backoffice extensions is. It outlines the manifest structure, required fields, and optional features used across types. ## What is an Extension Manifest? -An Extension Manifest declares a single backoffice extension and its configuration. +This page explains what an Extension Manifest for Umbraco backoffice extensions is. It outlines the manifest structure, required fields, and optional features used across types. Umbraco reads the manifest to register the extension in the Extension Registry. Each extension is of a certain type and this determines the required fields of the manifest and its available capabilities. -Some extensions need extra assets, like a JavaScript file with a Web Component. +An Extension Manifest declares a single backoffice extension along with its configuration. ## Extension Manifest Format -An Extension Manifest has a strict format where some properties are required and some depend on the Extension Type. An Extension Manifest can be written as a JavaScript or JSON Object. We'll dive deeper into that when [registering an extension](extension-registry). +Some extensions need extra assets, such as a JavaScript file with a Web Component. The abilities of the extensions rely on the specific extension type. The Type sets the scene for what the extension can do and what it needs to be utilized. Some extension types can be made purely via the manifest, like a section or menu item. Other types require files, like a JavaScript file containing a Web Component, like a custom property editor. - +An Extension Manifest has a strict format where some properties are required and some depend on the Extension Type. An Extension Manifest can be written as a JavaScript or JSON object. You can learn more about this when [registering an extension](extension-registry). ### Required Manifest properties A minimal Extension Manifest looks like this: @@ -42,44 +42,4 @@ Most extension types support the use of the following generic features for their * `kind` - Some extension types can reference a predefined Kind. By specifying a Kind, the manifest inherits the Kind's properties. This allows for reuse of predefined settings. See [Extension Kind](../extension-kind.md). * `meta` - Many Extension Types require additional information declared as part of a `meta` field. It depends on the extension what is required. For instance label and icon of a menu item. -For more information, see an overview of all possible [Extension Types](../extension-types/) and their requirements. - - ----- Below should be moved or removed, because it requires too much context for this file ----- - -## Type intellisense -It is recommended to make use of the Type IntelliSense that we provide. - -When writing your Manifest in TypeScript, you should use the Type `UmbExtensionManifest`. See the article on [Development Setup](../../development-flow/) to ensure you have Types correctly configured. - -{% code title="manifests.ts" %} -```typescript -export const manifests: Array = [ - { - type: '...', - alias: 'my.customization', - name: 'My customization' - ... - } -] -``` -{% endcode %} - -When writing the Umbraco Package Manifest, you can use the JSON Schema located in the root of your Umbraco project called `umbraco-package-schema.json` . - -```json -{ - "$schema": "../../umbraco-package-schema.json", - "name": "My Customizations", - "extensions": [ - { - "type": "...", - "alias": "my.customization", - "name": "My customization" - ... - }, - ... - ] -} -``` - +For more information, see an overview of all possible [Extension Types](../extension-types/) and their requirements. \ No newline at end of file diff --git a/16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md b/16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md index 833730635e8..9f41f0c13ce 100644 --- a/16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md +++ b/16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md @@ -4,11 +4,13 @@ description: >- registering an Extension via an Extension Manifest. --- -# Register extensions -Whether you're looking to make extensions in the context of an Umbraco project or a package, you always need a specific JSON file for this, the umbraco-package.json file. This is the starting point of any extension. + +# Register Extensions +Whether you are looking to make extensions in the context of an Umbraco project or a package, you always need a specific JSON file for this: the umbraco-package.json file. This is the starting point for any extension. + ## Umbraco-package.json -To get extensions registered in Umbraco, you need to have an `umbraco-package.json` file. This file needs to be located in `wwwroot/App_Plugins/#YOUR_EXTENSION_NAME#`. Umbraco scans for these files on boot and reads the [`extension manifests`](extension-manifest.md) that are present in the file to register the extensions. +To get extensions registered in Umbraco, you need to have an `umbraco-package.json` file. This file must be located in or in a subfolder of either the `App_Plugins` folder or the `wwwroot` folder. It's recommended to place the file in `App_Plugins/#YOUR_EXTENSION_NAME#/umbraco-package.json`, or in `wwwroot/App_Plugins/#YOUR_EXTENSION_NAME#/umbraco-package.json` for packages and Razor Class Libraries. Umbraco scans for these files on boot and reads the [`Extension Manifests`](extension-manifest.md) that are present in the file to register the extensions. {% hint style="info" %} Even though the file is called umbraco-package.json and even though it will be displayed in the 'installed packages' overview in the backoffice, it does not mean that extensions can only work in the context of a package. @@ -31,7 +33,8 @@ Even though the file is called umbraco-package.json and even though it will be d ``` {% endcode %} -When writing the Umbraco Package Manifest, you can use the JSON Schema located in the root of your Umbraco project. The file is called `umbraco-package-schema.json` + +When writing the Umbraco Package Manifest, you can use the JSON Schema located in the root of your Umbraco project. The file is called `umbraco-package-schema.json`. {% code title="umbraco-package.json" %} ```json @@ -45,11 +48,13 @@ When writing the Umbraco Package Manifest, you can use the JSON Schema located i ``` {% endcode %} -There are two additional properties that are not required, but can be useful: + +There are two additional, optional properties that can be useful: * `id` - a unique identifier of the package. If you are creating a NuGet package, use that as the id. * `version` - the version of the package that is displayed in the backoffice in the overview of installed packages. This is also used for package migrations. + This is an example of a full umbraco-package.json that registers two localization extensions: ```json @@ -81,27 +86,30 @@ This is an example of a full umbraco-package.json that registers two localizatio } ``` -## Advanced registration -### The bundle approach -Instead of registering each manifest in the `umbraco-package.json` you can have multiple manifests and build them into a bundle. You then register this bundle in a single `bundle` extension. In larger projects with a lot of extensions, this allows you to keep your umbraco-package.json file leaner. Read more in the [bundle approach](../extension-types/bundle.md). -### The entry point approach -The Entry Point is an Extension that executes a method on startup. This can be used for different tasks, such as performing initial configuration and registering other Extension Manifests. Read more in [the entry point approach](../extension-types/backoffice-entry-point.md). +## Advanced Registration +### The Bundle Approach +Instead of registering each manifest in the `umbraco-package.json`, you can have multiple manifests and build them into a bundle. You then register this bundle in a single `bundle` extension. In larger projects with a lot of extensions, this allows you to keep your umbraco-package.json file leaner. Read more in the [bundle approach](../extension-types/bundle.md). + +### The Entry Point Approach +The Entry Point is an extension that executes a method on startup. You can use this for different tasks, such as performing initial configuration and registering other Extension Manifests. Read more in [the entry point approach](../extension-types/backoffice-entry-point.md). -### Registration with JavaScript on the fly -In some cases, extensions are not static and cannot be registered in the umbraco-package.json or in a bundle. For instance, your manifest gets defined based on information from the server. Or you can even generate the manifests server side based on data in the database. In that case, you need to register extensions on the fly. +### Registration with JavaScript on the Fly +In some cases, extensions are not static and cannot be registered in the umbraco-package.json or in a bundle. For instance, your manifest might be defined based on information from the server, or you might generate the manifests server side based on data in the database. In that case, you need to register extensions on the fly. -The following example shows how to register an extension manifest via JavaScript/TypeScript code: +The following example shows how to register an Extension Manifest via JavaScript/TypeScript code: ```typescript + import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; const manifest = { - type: '...', - ... + type: '...', + // ... }; -umbExtensionsRegistry.register(extension); +umbExtensionsRegistry.register(manifest); ``` -When and where to execute this code is up to you and depending on your situation. But in a lot of cases, it makes sense to execute this on boot, using the [the entry point approach](../extension-types/backoffice-entry-point.md). + +When and where you execute this code depends on your situation. In many cases, it makes sense to execute this on boot, using the [entry point approach](../extension-types/backoffice-entry-point.md). diff --git a/16/umbraco-cms/customizing/extending-overview/extension-registry/replace-exclude-or-unregister.md b/16/umbraco-cms/customizing/extending-overview/extension-registry/replace-exclude-or-unregister.md index cf4650f0b04..7b151f1f65f 100644 --- a/16/umbraco-cms/customizing/extending-overview/extension-registry/replace-exclude-or-unregister.md +++ b/16/umbraco-cms/customizing/extending-overview/extension-registry/replace-exclude-or-unregister.md @@ -4,12 +4,15 @@ description: >- interest, 3 different options are available. --- + # Replace, Exclude or Unregister -Besides adding extensions to Umbraco, sometimes you want to change what's already there. You can replace extensions with your own and exclude or unregister extensions. +Besides adding extensions to Umbraco, sometimes you want to change what is already there. You can replace extensions with your own and exclude or unregister extensions. + ## Replace You can have an extension that replaces another extension. -This can be done by defining `overwrites` of your [manifest](extension-manifest.md) with one Extension-alias or an array of Extension-aliases that need to be replaced. +You can do this by defining the `overwrites` property in your [Extension Manifest](extension-manifest.md) with one Extension Alias or an array of Extension Aliases that need to be replaced. + @@ -25,6 +28,7 @@ const manifest = { }; ``` + This example overrides both the save and preview button as well as the save button with an external preview button (multiple overwrite): ```typescript @@ -37,15 +41,19 @@ const manifest = { }; ``` -If your extension has conditions, then the overwrites will only be hidden when your extension is displayed. This means that the overwrites only have an effect if all the conditions are permitted and the extensions are displayed at the same spot. + +If your extension has conditions, the overwritten extensions will only be hidden when your extension is displayed. This means that the overwrites only have an effect if all the conditions are permitted and the extensions are displayed at the same spot. + ## Exclude -When you exclude an extension, the extension will never be displayed. This allows for permanently hiding for example a menu or a button. This does not unregister the extensions, but rather flags it as excluded. This also means that no-one else can register an extension with the same alias as the excluded extension. +When you exclude an extension, the extension will never be displayed. This allows you to permanently hide, for example, a menu or a button. This does not unregister the extensions, but rather flags them as excluded. This also means that no one else can register an extension with the same alias as the excluded extension. + {% hint style="warning" %} -Currently, it's not possible to un-exclude extensions once excluded. +Currently, it is not possible to un-exclude extensions once excluded. {% endhint %} + The following JavaScript code hides the `Save and Preview` button from the Document Workspace. ```typescript @@ -53,12 +61,14 @@ import { UmbExtensionRegistry } from '@umbraco-cms/backoffice/extension-api'; UmbExtensionRegistry.exclude('Umb.WorkspaceAction.Document.SaveAndPreview'); ``` -When and where to execute this code is up to you and depending on your situation. But in a lot of cases, it makes sense to execute this on boot, using the [the entry point approach](../extension-types/backoffice-entry-point.md). + +When and where you execute this code depends on your situation. In many cases, it makes sense to execute this on boot, using the [entry point approach](../extension-types/backoffice-entry-point.md). + ## Unregister -You can also choose to unregister an extension. It's recommended to only use this of on extension you registered yourself and have control over. Otherwise you might try to remove an extension before it's registered. A use case for this is if you temporarily registered an extension and you like to remove it again. +You can also choose to unregister an extension. You should only use this on extensions you registered yourself and have control over. Otherwise, you might try to remove an extension before it is registered. A use case for this is if you temporarily registered an extension and you want to remove it again. -In other cases you can use the `overwrites` or `exclude` option. The difference with the `exclude` approach, is that unregistering removes the extension from the extension registry. This allows for re-registering extensions with the same alias. +In other cases, you can use the `overwrites` or `exclude` option. The difference with the `exclude` approach is that unregistering removes the extension from the Extension Registry. This allows you to re-register extensions with the same alias. ```typescript import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; @@ -66,6 +76,7 @@ import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registr umbExtensionsRegistry.unregister('My.WorkspaceAction.AutoFillWithUnicorns'); ``` -When and where to execute this code is up to you and depending on your situation. But in a lot of cases, it makes sense to execute this on boot, using the [the entry point approach](../extension-types/backoffice-entry-point.md). + +When and where you execute this code depends on your situation. In many cases, it makes sense to execute this on boot, using the [entry point approach](../extension-types/backoffice-entry-point.md). From dab9fa9c2fd02acfa160cf92e2599f45d6f2d5be Mon Sep 17 00:00:00 2001 From: Luuk Peters Date: Fri, 26 Sep 2025 11:46:36 +0200 Subject: [PATCH 04/32] PUsh to reopen PR --- .../extending-overview/extension-registry/register-extensions.md | 1 - 1 file changed, 1 deletion(-) diff --git a/16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md b/16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md index 9f41f0c13ce..df93891e818 100644 --- a/16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md +++ b/16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md @@ -8,7 +8,6 @@ description: >- # Register Extensions Whether you are looking to make extensions in the context of an Umbraco project or a package, you always need a specific JSON file for this: the umbraco-package.json file. This is the starting point for any extension. - ## Umbraco-package.json To get extensions registered in Umbraco, you need to have an `umbraco-package.json` file. This file must be located in or in a subfolder of either the `App_Plugins` folder or the `wwwroot` folder. It's recommended to place the file in `App_Plugins/#YOUR_EXTENSION_NAME#/umbraco-package.json`, or in `wwwroot/App_Plugins/#YOUR_EXTENSION_NAME#/umbraco-package.json` for packages and Razor Class Libraries. Umbraco scans for these files on boot and reads the [`Extension Manifests`](extension-manifest.md) that are present in the file to register the extensions. From b3e303dd0a5fcf03f7f386b0c043626047251dca Mon Sep 17 00:00:00 2001 From: Luuk Peters Date: Fri, 26 Sep 2025 13:36:39 +0200 Subject: [PATCH 05/32] Update 16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md Co-authored-by: Richard Jackson --- .../extending-overview/extension-registry/extension-manifest.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md b/16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md index 8b3debabee0..1fe8ea11bd9 100644 --- a/16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md +++ b/16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md @@ -3,7 +3,7 @@ description: Learn about the different methods for declaring an Extension Manife --- # Extension Manifest -This page explains what an Extension Manifests for Umbraco backoffice extensions is. It outlines the manifest structure, required fields, and optional features used across types. +This page explains what an Extension Manifest for a Umbraco backoffice extension is. It outlines the manifest structure, required fields, and optional features used across types. ## What is an Extension Manifest? This page explains what an Extension Manifest for Umbraco backoffice extensions is. It outlines the manifest structure, required fields, and optional features used across types. From c747a992c5ff0088a7066103ad130a6398addb4e Mon Sep 17 00:00:00 2001 From: Luuk Peters Date: Fri, 26 Sep 2025 13:36:54 +0200 Subject: [PATCH 06/32] Update 16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md Co-authored-by: Richard Jackson --- .../extending-overview/extension-registry/extension-manifest.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md b/16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md index 1fe8ea11bd9..9dcfeb9447f 100644 --- a/16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md +++ b/16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md @@ -7,7 +7,7 @@ This page explains what an Extension Manifest for a Umbraco backoffice extension ## What is an Extension Manifest? This page explains what an Extension Manifest for Umbraco backoffice extensions is. It outlines the manifest structure, required fields, and optional features used across types. -Umbraco reads the manifest to register the extension in the Extension Registry. +Umbraco reads the extension manifest to register the extension in the Extension Registry. Each extension is of a certain type and this determines the required fields of the manifest and its available capabilities. An Extension Manifest declares a single backoffice extension along with its configuration. From b62c89a7530571c76ecdafc1128cce1efafc0736 Mon Sep 17 00:00:00 2001 From: Luuk Peters Date: Fri, 26 Sep 2025 13:37:16 +0200 Subject: [PATCH 07/32] Update 16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md Co-authored-by: Richard Jackson --- .../extending-overview/extension-registry/extension-manifest.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md b/16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md index 9dcfeb9447f..03b85902778 100644 --- a/16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md +++ b/16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md @@ -14,7 +14,7 @@ An Extension Manifest declares a single backoffice extension along with its conf ## Extension Manifest Format Some extensions need extra assets, such as a JavaScript file with a Web Component. -The abilities of the extensions rely on the specific extension type. The Type sets the scene for what the extension can do and what it needs to be utilized. Some extension types can be made purely via the manifest, like a section or menu item. Other types require files, like a JavaScript file containing a Web Component, like a custom property editor. +The abilities of the extensions rely on the specific extension type. The type sets the scene for what the extension can do and what it needs to be utilized. Some extension types can be made purely via the manifest, like a section or menu item. Other types require files, like a JavaScript file containing a Web Component, like a custom property editor. An Extension Manifest has a strict format where some properties are required and some depend on the Extension Type. An Extension Manifest can be written as a JavaScript or JSON object. You can learn more about this when [registering an extension](extension-registry). ### Required Manifest properties A minimal Extension Manifest looks like this: From dcb707aa7aab5f4193b1d132c16caffffe20767a Mon Sep 17 00:00:00 2001 From: Luuk Peters Date: Fri, 26 Sep 2025 13:37:39 +0200 Subject: [PATCH 08/32] Update 16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md Co-authored-by: Richard Jackson --- .../extending-overview/extension-registry/extension-manifest.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md b/16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md index 03b85902778..12c97cc5c10 100644 --- a/16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md +++ b/16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md @@ -30,7 +30,7 @@ A minimal Extension Manifest looks like this: These fields are all required and have the following meaning: * `type` — The type defines the purpose of the extension. Umbraco has many [extension types](../extension-types) available. -* `alias` — This is a unique identifier for this manifest. Prefix it with something that makes your extension unique. For example: _FictiveCompany.MyProject.Dashboard.Overview_. +* `alias` — Unique identifier for this manifest. Prefix it with something that makes your extension unique. For example: _FictiveCompany.MyProject.Dashboard.Overview_. * `name` — This is a representational name of this manifest; It does not need to be unique, but this can be beneficial when debugging extensions. This name also shows up in the Extensions Insights in the backoffice of Umbraco. For example: _My Fictive Company Overview Dashboard_. ### Additional Manifest properties From 8fd0c0fb9b1c7a28b6e5782f43ba1a39290803f8 Mon Sep 17 00:00:00 2001 From: Luuk Peters Date: Fri, 26 Sep 2025 13:37:58 +0200 Subject: [PATCH 09/32] Update 16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md Co-authored-by: Richard Jackson --- .../extending-overview/extension-registry/extension-manifest.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md b/16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md index 12c97cc5c10..49584e4715f 100644 --- a/16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md +++ b/16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md @@ -31,7 +31,7 @@ These fields are all required and have the following meaning: * `type` — The type defines the purpose of the extension. Umbraco has many [extension types](../extension-types) available. * `alias` — Unique identifier for this manifest. Prefix it with something that makes your extension unique. For example: _FictiveCompany.MyProject.Dashboard.Overview_. -* `name` — This is a representational name of this manifest; It does not need to be unique, but this can be beneficial when debugging extensions. This name also shows up in the Extensions Insights in the backoffice of Umbraco. For example: _My Fictive Company Overview Dashboard_. +* `name` — Representational name of this manifest. This name does not need to be unique, but this can be beneficial when debugging extensions. This name also shows up in the Extensions Insights in the backoffice of Umbraco. For example: _My Fictive Company Overview Dashboard_. ### Additional Manifest properties Most extension types support the use of the following generic features for their Manifest: From 16bb839c9bec2bff0f958e28c4d2c3718868c9f6 Mon Sep 17 00:00:00 2001 From: Luuk Peters Date: Fri, 26 Sep 2025 13:38:25 +0200 Subject: [PATCH 10/32] Update 16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md Co-authored-by: Richard Jackson --- .../extending-overview/extension-registry/extension-manifest.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md b/16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md index 49584e4715f..f6906d2ab51 100644 --- a/16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md +++ b/16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md @@ -36,7 +36,7 @@ These fields are all required and have the following meaning: ### Additional Manifest properties Most extension types support the use of the following generic features for their Manifest: -* `weight` - Define a weight to determine the importance or visual order of this extension. A higher weight gives a more prominent position. For instance, for a dashboard it determines it's order between other dashboards. +* `weight` - Define a weight to determine the importance or visual order of this extension. A higher weight gives a more prominent position. For instance, for a dashboard it determines its order between other dashboards. * `overwrites` - If replacing an existing extension, this define one or more Extension Aliases that this extension should replace. Read more in [Replace, Exclude or Unregister extensions](replace-exclude-or-unregister.md). * `conditions` - Define one or more conditions that must pass for the extension to become available. For instance, don't show a section if you don't have the proper rights. Read more in [Extension Conditions](../extension-conditions.md). * `kind` - Some extension types can reference a predefined Kind. By specifying a Kind, the manifest inherits the Kind's properties. This allows for reuse of predefined settings. See [Extension Kind](../extension-kind.md). From f21f543a733298570e2ca487154943a9fa78f06b Mon Sep 17 00:00:00 2001 From: Luuk Peters Date: Fri, 26 Sep 2025 13:38:57 +0200 Subject: [PATCH 11/32] Update 16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md Co-authored-by: Richard Jackson --- .../extending-overview/extension-registry/extension-manifest.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md b/16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md index f6906d2ab51..58789f63abd 100644 --- a/16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md +++ b/16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md @@ -39,7 +39,7 @@ Most extension types support the use of the following generic features for their * `weight` - Define a weight to determine the importance or visual order of this extension. A higher weight gives a more prominent position. For instance, for a dashboard it determines its order between other dashboards. * `overwrites` - If replacing an existing extension, this define one or more Extension Aliases that this extension should replace. Read more in [Replace, Exclude or Unregister extensions](replace-exclude-or-unregister.md). * `conditions` - Define one or more conditions that must pass for the extension to become available. For instance, don't show a section if you don't have the proper rights. Read more in [Extension Conditions](../extension-conditions.md). -* `kind` - Some extension types can reference a predefined Kind. By specifying a Kind, the manifest inherits the Kind's properties. This allows for reuse of predefined settings. See [Extension Kind](../extension-kind.md). +* `kind` - Some extension types can reference a predefined `kind`. By specifying a `kind`, the manifest inherits the `kind`'s properties. This allows for reuse of predefined settings. See [Extension Kind](../extension-kind.md). * `meta` - Many Extension Types require additional information declared as part of a `meta` field. It depends on the extension what is required. For instance label and icon of a menu item. For more information, see an overview of all possible [Extension Types](../extension-types/) and their requirements. \ No newline at end of file From 65891de7cd462536abef86fe6e1c00b836e8e8f1 Mon Sep 17 00:00:00 2001 From: Luuk Peters Date: Fri, 26 Sep 2025 13:39:31 +0200 Subject: [PATCH 12/32] Update 16/umbraco-cms/customizing/extending-overview/extension-registry/README.md Co-authored-by: Richard Jackson --- .../customizing/extending-overview/extension-registry/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/16/umbraco-cms/customizing/extending-overview/extension-registry/README.md b/16/umbraco-cms/customizing/extending-overview/extension-registry/README.md index 03e5b422080..60f9cad641a 100644 --- a/16/umbraco-cms/customizing/extending-overview/extension-registry/README.md +++ b/16/umbraco-cms/customizing/extending-overview/extension-registry/README.md @@ -5,7 +5,7 @@ description: >- --- # Extension Registry -The Umbraco backoffice is build with extendability in mind. The backoffice without extensions is more or less a blank canvas that is build out using extensions. These extensions dictate how the backoffice functions and looks. All visual elements in an Umbraco installation, like the sections, menu's, trees and buttons, are extensions. But extensions also dictate behaviour and the editing experience. So everything in the backoffice is governed (and extendable) by extensions. +The Umbraco backoffice is built with extensibility in mind. The backoffice without extensions is more or less a blank canvas that is build out using extensions. These extensions dictate how the backoffice functions and looks. All visual elements in an Umbraco installation, like the sections, menus, trees and buttons, are extensions. But extensions also dictate behaviour and the editing experience. So everything in the backoffice is governed (and extendable) by extensions. {% hint style="info" %} You can see in the backoffice what extensions are registered and to go to Settings > Extensions Insights. From 2fae8edeecbcc1143c0166d78a4bd0b9bcefe571 Mon Sep 17 00:00:00 2001 From: Luuk Peters Date: Fri, 26 Sep 2025 13:39:56 +0200 Subject: [PATCH 13/32] Update 16/umbraco-cms/customizing/extending-overview/extension-registry/README.md Co-authored-by: Richard Jackson --- .../customizing/extending-overview/extension-registry/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/16/umbraco-cms/customizing/extending-overview/extension-registry/README.md b/16/umbraco-cms/customizing/extending-overview/extension-registry/README.md index 60f9cad641a..bf6b0db81f7 100644 --- a/16/umbraco-cms/customizing/extending-overview/extension-registry/README.md +++ b/16/umbraco-cms/customizing/extending-overview/extension-registry/README.md @@ -8,7 +8,7 @@ description: >- The Umbraco backoffice is built with extensibility in mind. The backoffice without extensions is more or less a blank canvas that is build out using extensions. These extensions dictate how the backoffice functions and looks. All visual elements in an Umbraco installation, like the sections, menus, trees and buttons, are extensions. But extensions also dictate behaviour and the editing experience. So everything in the backoffice is governed (and extendable) by extensions. {% hint style="info" %} -You can see in the backoffice what extensions are registered and to go to Settings > Extensions Insights. +You can see which extensions are registered in the backoffice by going to Settings > Extensions Insights. {% endhint %} All extensions are registered in the extension registry. The registry can be manipulated at any time, meaning you can add or remove extensions at runtime. You as a developer have the same possibilities as an Umbraco HQ developer, which means what HQ can do, you can do. This also means that you can change almost everything that is by default present in Umbraco. From 7bc234c7e96af641084a52b92f9cf2c9164d8418 Mon Sep 17 00:00:00 2001 From: Luuk Peters Date: Fri, 26 Sep 2025 13:40:21 +0200 Subject: [PATCH 14/32] Update 16/umbraco-cms/customizing/extending-overview/extension-registry/README.md Co-authored-by: Richard Jackson --- .../customizing/extending-overview/extension-registry/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/16/umbraco-cms/customizing/extending-overview/extension-registry/README.md b/16/umbraco-cms/customizing/extending-overview/extension-registry/README.md index bf6b0db81f7..ada60e729fd 100644 --- a/16/umbraco-cms/customizing/extending-overview/extension-registry/README.md +++ b/16/umbraco-cms/customizing/extending-overview/extension-registry/README.md @@ -14,7 +14,7 @@ You can see which extensions are registered in the backoffice by going to Settin All extensions are registered in the extension registry. The registry can be manipulated at any time, meaning you can add or remove extensions at runtime. You as a developer have the same possibilities as an Umbraco HQ developer, which means what HQ can do, you can do. This also means that you can change almost everything that is by default present in Umbraco. ## [Introduction to a Extension Manifest](extension-manifest.md) -An Extension Manifest is a declaration on what you want to register in the Umbraco backoffice. This articles handles what an extension manifest looks like and what is required or not. +An Extension Manifest is a declaration on what you want to register in the Umbraco backoffice. This articles handles the layout and requirements of an Extension Manifest. ## [Register an extension](extension-registry.md) This article handles how to register an extension using an umbraco-package.json file. From 6b90f5589bee1356169df8394df27d3b1e2819ad Mon Sep 17 00:00:00 2001 From: Luuk Peters Date: Fri, 26 Sep 2025 13:41:00 +0200 Subject: [PATCH 15/32] Update 16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md Co-authored-by: Richard Jackson --- .../extension-registry/register-extensions.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md b/16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md index df93891e818..ab2c0ee83db 100644 --- a/16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md +++ b/16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md @@ -6,7 +6,7 @@ description: >- # Register Extensions -Whether you are looking to make extensions in the context of an Umbraco project or a package, you always need a specific JSON file for this: the umbraco-package.json file. This is the starting point for any extension. +Making extensions to either an Umbraco project or a package requires an umbraco-package.json file. This JSON file is the starting point for any extension. ## Umbraco-package.json To get extensions registered in Umbraco, you need to have an `umbraco-package.json` file. This file must be located in or in a subfolder of either the `App_Plugins` folder or the `wwwroot` folder. It's recommended to place the file in `App_Plugins/#YOUR_EXTENSION_NAME#/umbraco-package.json`, or in `wwwroot/App_Plugins/#YOUR_EXTENSION_NAME#/umbraco-package.json` for packages and Razor Class Libraries. Umbraco scans for these files on boot and reads the [`Extension Manifests`](extension-manifest.md) that are present in the file to register the extensions. From 5afc948eb1f0a0a56d1abff26335461f4bcee72e Mon Sep 17 00:00:00 2001 From: Luuk Peters Date: Fri, 26 Sep 2025 13:41:40 +0200 Subject: [PATCH 16/32] Update 16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md Co-authored-by: Richard Jackson --- .../extension-registry/register-extensions.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md b/16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md index ab2c0ee83db..3161e381bb2 100644 --- a/16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md +++ b/16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md @@ -12,7 +12,7 @@ Making extensions to either an Umbraco project or a package requires an umbraco- To get extensions registered in Umbraco, you need to have an `umbraco-package.json` file. This file must be located in or in a subfolder of either the `App_Plugins` folder or the `wwwroot` folder. It's recommended to place the file in `App_Plugins/#YOUR_EXTENSION_NAME#/umbraco-package.json`, or in `wwwroot/App_Plugins/#YOUR_EXTENSION_NAME#/umbraco-package.json` for packages and Razor Class Libraries. Umbraco scans for these files on boot and reads the [`Extension Manifests`](extension-manifest.md) that are present in the file to register the extensions. {% hint style="info" %} -Even though the file is called umbraco-package.json and even though it will be displayed in the 'installed packages' overview in the backoffice, it does not mean that extensions can only work in the context of a package. +Extensions can also work outside of the context of a package. {% endhint %} {% code title="umbraco-package.json" %} From 7d7d0dd9127f7c671246f7eac37d70a9f290814f Mon Sep 17 00:00:00 2001 From: Luuk Peters Date: Fri, 26 Sep 2025 13:42:01 +0200 Subject: [PATCH 17/32] Update 16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md Co-authored-by: Richard Jackson --- .../extension-registry/register-extensions.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md b/16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md index 3161e381bb2..3c69132fbe3 100644 --- a/16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md +++ b/16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md @@ -33,7 +33,7 @@ Extensions can also work outside of the context of a package. {% endcode %} -When writing the Umbraco Package Manifest, you can use the JSON Schema located in the root of your Umbraco project. The file is called `umbraco-package-schema.json`. +When writing the Umbraco Package Manifest, you can use the JSON schema located in the root of your Umbraco project. This file is called `umbraco-package-schema.json`. {% code title="umbraco-package.json" %} ```json From 4e94f22fd35f5785e1e5be59d429b1d6349d1fcd Mon Sep 17 00:00:00 2001 From: Luuk Peters Date: Fri, 26 Sep 2025 13:42:23 +0200 Subject: [PATCH 18/32] Update 16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md Co-authored-by: Richard Jackson --- .../extension-registry/register-extensions.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md b/16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md index 3c69132fbe3..7ad4e1c716d 100644 --- a/16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md +++ b/16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md @@ -50,7 +50,7 @@ When writing the Umbraco Package Manifest, you can use the JSON schema located i There are two additional, optional properties that can be useful: -* `id` - a unique identifier of the package. If you are creating a NuGet package, use that as the id. +* `id` - a unique identifier of the package. If you are creating a NuGet package, use this value as the id. * `version` - the version of the package that is displayed in the backoffice in the overview of installed packages. This is also used for package migrations. From 1b1ca4d8bf92bdb8516287c69068b99c0bce4bc7 Mon Sep 17 00:00:00 2001 From: Luuk Peters Date: Fri, 26 Sep 2025 13:43:01 +0200 Subject: [PATCH 19/32] Update 16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md Co-authored-by: Richard Jackson --- .../extension-registry/register-extensions.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md b/16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md index 7ad4e1c716d..3c5226806c1 100644 --- a/16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md +++ b/16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md @@ -94,7 +94,13 @@ Instead of registering each manifest in the `umbraco-package.json`, you can have The Entry Point is an extension that executes a method on startup. You can use this for different tasks, such as performing initial configuration and registering other Extension Manifests. Read more in [the entry point approach](../extension-types/backoffice-entry-point.md). ### Registration with JavaScript on the Fly -In some cases, extensions are not static and cannot be registered in the umbraco-package.json or in a bundle. For instance, your manifest might be defined based on information from the server, or you might generate the manifests server side based on data in the database. In that case, you need to register extensions on the fly. +In some cases, extensions are not static and cannot be registered in the umbraco-package.json or in a bundle. Here are some examples of these cases: + +- your manifest might be defined based on information from the server +- you might generate the manifests server side based on data in the database. + +In cases such as these, you need to register extensions on the fly. + The following example shows how to register an Extension Manifest via JavaScript/TypeScript code: From 6bcd917863c8e05c1b787f0d259ce69e3fd2371a Mon Sep 17 00:00:00 2001 From: Luuk Peters Date: Fri, 26 Sep 2025 13:43:21 +0200 Subject: [PATCH 20/32] Update 16/umbraco-cms/customizing/extending-overview/extension-registry/replace-exclude-or-unregister.md Co-authored-by: Richard Jackson --- .../extension-registry/replace-exclude-or-unregister.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/16/umbraco-cms/customizing/extending-overview/extension-registry/replace-exclude-or-unregister.md b/16/umbraco-cms/customizing/extending-overview/extension-registry/replace-exclude-or-unregister.md index 7b151f1f65f..180c55dea7d 100644 --- a/16/umbraco-cms/customizing/extending-overview/extension-registry/replace-exclude-or-unregister.md +++ b/16/umbraco-cms/customizing/extending-overview/extension-registry/replace-exclude-or-unregister.md @@ -11,7 +11,7 @@ Besides adding extensions to Umbraco, sometimes you want to change what is alrea ## Replace You can have an extension that replaces another extension. -You can do this by defining the `overwrites` property in your [Extension Manifest](extension-manifest.md) with one Extension Alias or an array of Extension Aliases that need to be replaced. +You can do this by defining the `overwrites` property in your [Extension Manifest](extension-manifest.md) with one Extension Alias. For multiple `overwrites` you can provide the Extension Aliases that need to be replaced as an array. From a9f2cdbb5c6220ee3822f91ae87ba619a54254f7 Mon Sep 17 00:00:00 2001 From: Luuk Peters Date: Fri, 26 Sep 2025 13:56:01 +0200 Subject: [PATCH 21/32] Refine descriptions in README and extension-manifest documentation for clarity --- .../extending-overview/extension-registry/README.md | 5 ++--- .../extension-registry/extension-manifest.md | 1 - 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/16/umbraco-cms/customizing/extending-overview/extension-registry/README.md b/16/umbraco-cms/customizing/extending-overview/extension-registry/README.md index ada60e729fd..7b301272765 100644 --- a/16/umbraco-cms/customizing/extending-overview/extension-registry/README.md +++ b/16/umbraco-cms/customizing/extending-overview/extension-registry/README.md @@ -1,7 +1,6 @@ --- description: >- - Almost any UI in the Backoffice is an extension. All managed by the Extension - Registry on the Client at Runtime. Giving you enormous flexibility. + Almost any UI in the Backoffice is an extension managed by the Extension Registry. --- # Extension Registry @@ -14,7 +13,7 @@ You can see which extensions are registered in the backoffice by going to Settin All extensions are registered in the extension registry. The registry can be manipulated at any time, meaning you can add or remove extensions at runtime. You as a developer have the same possibilities as an Umbraco HQ developer, which means what HQ can do, you can do. This also means that you can change almost everything that is by default present in Umbraco. ## [Introduction to a Extension Manifest](extension-manifest.md) -An Extension Manifest is a declaration on what you want to register in the Umbraco backoffice. This articles handles the layout and requirements of an Extension Manifest. +An Extension Manifest is a declaration of what you want to register in the Umbraco backoffice. This articles handles the layout and requirements of an Extension Manifest. ## [Register an extension](extension-registry.md) This article handles how to register an extension using an umbraco-package.json file. diff --git a/16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md b/16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md index 58789f63abd..a5808e5090b 100644 --- a/16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md +++ b/16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md @@ -6,7 +6,6 @@ description: Learn about the different methods for declaring an Extension Manife This page explains what an Extension Manifest for a Umbraco backoffice extension is. It outlines the manifest structure, required fields, and optional features used across types. ## What is an Extension Manifest? -This page explains what an Extension Manifest for Umbraco backoffice extensions is. It outlines the manifest structure, required fields, and optional features used across types. Umbraco reads the extension manifest to register the extension in the Extension Registry. Each extension is of a certain type and this determines the required fields of the manifest and its available capabilities. An Extension Manifest declares a single backoffice extension along with its configuration. From ce6a3d940c3d6879a702aa7d934546ca221f75a6 Mon Sep 17 00:00:00 2001 From: Luuk Peters Date: Fri, 26 Sep 2025 13:57:50 +0200 Subject: [PATCH 22/32] Update 16/umbraco-cms/customizing/extending-overview/extension-registry/replace-exclude-or-unregister.md Co-authored-by: Michael Latouche --- .../extension-registry/replace-exclude-or-unregister.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/16/umbraco-cms/customizing/extending-overview/extension-registry/replace-exclude-or-unregister.md b/16/umbraco-cms/customizing/extending-overview/extension-registry/replace-exclude-or-unregister.md index 180c55dea7d..b53380c61c9 100644 --- a/16/umbraco-cms/customizing/extending-overview/extension-registry/replace-exclude-or-unregister.md +++ b/16/umbraco-cms/customizing/extending-overview/extension-registry/replace-exclude-or-unregister.md @@ -16,7 +16,7 @@ You can do this by defining the `overwrites` property in your [Extension Manifes -This example overrides the save and preview button with an external preview button (single overwrite): +This example overrides the `save and preview` button with an external "preview" button (single overwrite): ```typescript const manifest = { From 504c1663b4d189494076cd6ea3ff71628ed759e5 Mon Sep 17 00:00:00 2001 From: Luuk Peters Date: Fri, 26 Sep 2025 14:01:30 +0200 Subject: [PATCH 23/32] Update 16/umbraco-cms/customizing/extending-overview/extension-registry/replace-exclude-or-unregister.md Co-authored-by: Michael Latouche --- .../extension-registry/replace-exclude-or-unregister.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/16/umbraco-cms/customizing/extending-overview/extension-registry/replace-exclude-or-unregister.md b/16/umbraco-cms/customizing/extending-overview/extension-registry/replace-exclude-or-unregister.md index b53380c61c9..ad4a7c7c603 100644 --- a/16/umbraco-cms/customizing/extending-overview/extension-registry/replace-exclude-or-unregister.md +++ b/16/umbraco-cms/customizing/extending-overview/extension-registry/replace-exclude-or-unregister.md @@ -10,7 +10,7 @@ Besides adding extensions to Umbraco, sometimes you want to change what is alrea ## Replace -You can have an extension that replaces another extension. +You can replace an existing extension by another one. You can do this by defining the `overwrites` property in your [Extension Manifest](extension-manifest.md) with one Extension Alias. For multiple `overwrites` you can provide the Extension Aliases that need to be replaced as an array. From c7953e069ebde68fe063ed2297d64077dfd90d17 Mon Sep 17 00:00:00 2001 From: Luuk Peters Date: Fri, 26 Sep 2025 14:02:19 +0200 Subject: [PATCH 24/32] Update 16/umbraco-cms/customizing/extending-overview/extension-registry/replace-exclude-or-unregister.md Co-authored-by: Michael Latouche --- .../extension-registry/replace-exclude-or-unregister.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/16/umbraco-cms/customizing/extending-overview/extension-registry/replace-exclude-or-unregister.md b/16/umbraco-cms/customizing/extending-overview/extension-registry/replace-exclude-or-unregister.md index ad4a7c7c603..5426786aedf 100644 --- a/16/umbraco-cms/customizing/extending-overview/extension-registry/replace-exclude-or-unregister.md +++ b/16/umbraco-cms/customizing/extending-overview/extension-registry/replace-exclude-or-unregister.md @@ -29,7 +29,7 @@ const manifest = { ``` -This example overrides both the save and preview button as well as the save button with an external preview button (multiple overwrite): +This example overrides both the `save and preview` button as well as the `save` button with an external "preview" button (multiple overwrite): ```typescript const manifest = { From 0148e1c04727bdacd84697752326471d8400bfaf Mon Sep 17 00:00:00 2001 From: Luuk Peters Date: Fri, 26 Sep 2025 14:03:04 +0200 Subject: [PATCH 25/32] Update 16/umbraco-cms/customizing/extending-overview/extension-registry/replace-exclude-or-unregister.md Co-authored-by: Michael Latouche --- .../extension-registry/replace-exclude-or-unregister.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/16/umbraco-cms/customizing/extending-overview/extension-registry/replace-exclude-or-unregister.md b/16/umbraco-cms/customizing/extending-overview/extension-registry/replace-exclude-or-unregister.md index 5426786aedf..d7b1f0dd5e5 100644 --- a/16/umbraco-cms/customizing/extending-overview/extension-registry/replace-exclude-or-unregister.md +++ b/16/umbraco-cms/customizing/extending-overview/extension-registry/replace-exclude-or-unregister.md @@ -46,7 +46,7 @@ If your extension has conditions, the overwritten extensions will only be hidden ## Exclude -When you exclude an extension, the extension will never be displayed. This allows you to permanently hide, for example, a menu or a button. This does not unregister the extensions, but rather flags them as excluded. This also means that no one else can register an extension with the same alias as the excluded extension. +When you exclude an extension, the extension will never be displayed. This allows you to permanently hide, for example, a menu or a button. This does not unregister the extension, but rather flags it as excluded. This also means that no one else can register an extension with the same alias as the excluded extension. {% hint style="warning" %} From f742741ccf826f5a5b25d5f72d984c8ea610284b Mon Sep 17 00:00:00 2001 From: Luuk Peters Date: Fri, 26 Sep 2025 14:03:22 +0200 Subject: [PATCH 26/32] Update 16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md Co-authored-by: Michael Latouche --- .../extension-registry/register-extensions.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md b/16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md index 3c5226806c1..638e02a486c 100644 --- a/16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md +++ b/16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md @@ -54,7 +54,7 @@ There are two additional, optional properties that can be useful: * `version` - the version of the package that is displayed in the backoffice in the overview of installed packages. This is also used for package migrations. -This is an example of a full umbraco-package.json that registers two localization extensions: +This is an example of a full `umbraco-package.json` that registers two localization extensions: ```json { From 99abb61e360207c32bce4331636f65702382a873 Mon Sep 17 00:00:00 2001 From: Luuk Peters Date: Fri, 26 Sep 2025 14:03:42 +0200 Subject: [PATCH 27/32] Update 16/umbraco-cms/customizing/extending-overview/extension-registry/replace-exclude-or-unregister.md Co-authored-by: Michael Latouche --- .../extension-registry/replace-exclude-or-unregister.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/16/umbraco-cms/customizing/extending-overview/extension-registry/replace-exclude-or-unregister.md b/16/umbraco-cms/customizing/extending-overview/extension-registry/replace-exclude-or-unregister.md index d7b1f0dd5e5..cd8de5eb9a4 100644 --- a/16/umbraco-cms/customizing/extending-overview/extension-registry/replace-exclude-or-unregister.md +++ b/16/umbraco-cms/customizing/extending-overview/extension-registry/replace-exclude-or-unregister.md @@ -66,7 +66,7 @@ When and where you execute this code depends on your situation. In many cases, i ## Unregister -You can also choose to unregister an extension. You should only use this on extensions you registered yourself and have control over. Otherwise, you might try to remove an extension before it is registered. A use case for this is if you temporarily registered an extension and you want to remove it again. +You can also choose to unregister an extension. You should only use this on extensions you registered yourself and have control over. Otherwise, you might try to remove an extension before it is registered. A use case for this, is if you temporarily registered an extension and you want to remove it again. In other cases, you can use the `overwrites` or `exclude` option. The difference with the `exclude` approach is that unregistering removes the extension from the Extension Registry. This allows you to re-register extensions with the same alias. From f63a2604a75473de31e6d98557ffcd2fa9cb1087 Mon Sep 17 00:00:00 2001 From: Luuk Peters Date: Fri, 26 Sep 2025 14:03:58 +0200 Subject: [PATCH 28/32] Update 16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md Co-authored-by: Michael Latouche --- .../extension-registry/register-extensions.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md b/16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md index 638e02a486c..c2678f62cca 100644 --- a/16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md +++ b/16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md @@ -1,6 +1,6 @@ --- description: >- - Bringing new UI or additional features to the Backoffice is done by + You can bring new UI or additional features to the Backoffice by registering an Extension via an Extension Manifest. --- From a72fa7c44c7a761ea40deafb5cb581af8ade3fc4 Mon Sep 17 00:00:00 2001 From: Luuk Peters Date: Fri, 26 Sep 2025 14:04:26 +0200 Subject: [PATCH 29/32] Update 16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md Co-authored-by: Michael Latouche --- .../extension-registry/register-extensions.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md b/16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md index c2678f62cca..a4ac1067b2c 100644 --- a/16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md +++ b/16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md @@ -74,7 +74,7 @@ This is an example of a full `umbraco-package.json` that registers two localizat }, { "type": "localization", - "alias": "MyCustomizations.Localize.NlNl", + "alias": "MyCustomizations.Localize.DkDk", "name": "Danish", "meta": { "culture": "dk" From 38be4e944caa236ebd71a047ddc80fd21c3afb08 Mon Sep 17 00:00:00 2001 From: Luuk Peters Date: Fri, 26 Sep 2025 14:04:40 +0200 Subject: [PATCH 30/32] Update 16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md Co-authored-by: Michael Latouche --- .../extension-registry/register-extensions.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md b/16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md index a4ac1067b2c..0e46a5e2455 100644 --- a/16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md +++ b/16/umbraco-cms/customizing/extending-overview/extension-registry/register-extensions.md @@ -88,7 +88,7 @@ This is an example of a full `umbraco-package.json` that registers two localizat ## Advanced Registration ### The Bundle Approach -Instead of registering each manifest in the `umbraco-package.json`, you can have multiple manifests and build them into a bundle. You then register this bundle in a single `bundle` extension. In larger projects with a lot of extensions, this allows you to keep your umbraco-package.json file leaner. Read more in the [bundle approach](../extension-types/bundle.md). +Instead of registering each manifest in the `umbraco-package.json`, you can have multiple manifests and build them into a bundle. You then register this bundle in a single `bundle` extension. In larger projects with a lot of extensions, this allows you to keep your `umbraco-package.json` file cleaner. Read more in the [bundle approach](../extension-types/bundle.md). ### The Entry Point Approach The Entry Point is an extension that executes a method on startup. You can use this for different tasks, such as performing initial configuration and registering other Extension Manifests. Read more in [the entry point approach](../extension-types/backoffice-entry-point.md). From 0af7332bc5b4998b10175f9e9e4214fcc8e3e948 Mon Sep 17 00:00:00 2001 From: Luuk Peters Date: Fri, 26 Sep 2025 14:05:51 +0200 Subject: [PATCH 31/32] Fixed a link --- .../extending-overview/extension-registry/extension-manifest.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md b/16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md index a5808e5090b..610c95a0e10 100644 --- a/16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md +++ b/16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md @@ -14,7 +14,7 @@ An Extension Manifest declares a single backoffice extension along with its conf Some extensions need extra assets, such as a JavaScript file with a Web Component. The abilities of the extensions rely on the specific extension type. The type sets the scene for what the extension can do and what it needs to be utilized. Some extension types can be made purely via the manifest, like a section or menu item. Other types require files, like a JavaScript file containing a Web Component, like a custom property editor. -An Extension Manifest has a strict format where some properties are required and some depend on the Extension Type. An Extension Manifest can be written as a JavaScript or JSON object. You can learn more about this when [registering an extension](extension-registry). +An Extension Manifest has a strict format where some properties are required and some depend on the Extension Type. An Extension Manifest can be written as a JavaScript or JSON object. You can learn more about this when [registering an extension](register-extensions.md). ### Required Manifest properties A minimal Extension Manifest looks like this: From 54e8a1cb8911fa205b8cc49ef7e04531e0a9b928 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Fri, 26 Sep 2025 14:43:02 +0200 Subject: [PATCH 32/32] Update extension-manifest.md --- .../extension-registry/extension-manifest.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md b/16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md index 610c95a0e10..9db6641c5e6 100644 --- a/16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md +++ b/16/umbraco-cms/customizing/extending-overview/extension-registry/extension-manifest.md @@ -36,9 +36,9 @@ These fields are all required and have the following meaning: Most extension types support the use of the following generic features for their Manifest: * `weight` - Define a weight to determine the importance or visual order of this extension. A higher weight gives a more prominent position. For instance, for a dashboard it determines its order between other dashboards. -* `overwrites` - If replacing an existing extension, this define one or more Extension Aliases that this extension should replace. Read more in [Replace, Exclude or Unregister extensions](replace-exclude-or-unregister.md). +* `overwrites` - If you want to omit an existing extension, then define one or more Extension Aliases that this extension should omit when presented. Read more in [Replace, Exclude or Unregister extensions](replace-exclude-or-unregister.md). * `conditions` - Define one or more conditions that must pass for the extension to become available. For instance, don't show a section if you don't have the proper rights. Read more in [Extension Conditions](../extension-conditions.md). * `kind` - Some extension types can reference a predefined `kind`. By specifying a `kind`, the manifest inherits the `kind`'s properties. This allows for reuse of predefined settings. See [Extension Kind](../extension-kind.md). -* `meta` - Many Extension Types require additional information declared as part of a `meta` field. It depends on the extension what is required. For instance label and icon of a menu item. +* `meta` - Many Extension Types require additional information declared as part of a `meta` field. It depends on the Extension Type what is required. For instance label and icon of a menu item. -For more information, see an overview of all possible [Extension Types](../extension-types/) and their requirements. \ No newline at end of file +For more information, see an overview of all possible [Extension Types](../extension-types/) and their requirements.