# MetalSoft Extensions > Available since 6.4 Extensions are a mechanism to extend the functionality of MetalSoft beyond what is provided out-of-the-box. Currently there is only a single type of extension, the 'app' extension that adds a custom button in the Infrastructure Editor. Creation Lifecycle: 1. The user clicks the button and a custom form is shown with inputs defined in the yaml file in the `inputs` field: ![](/assets/developer_resources/metalsoft_extensions_01.png) 2. The instance arrays are created according to the yaml specification 3. Upon Deploy the resources are deployed and the `oncreate` entrypoint is executed Update lifecycle 1. The user clicks the infrastructure elements and a form is opened allowing the user to change any of the input params. 2. Upon deploy additional resources are deployed as needed and the `onedit` entrypoint is executed Delete lifecycle 1. The user clicks the delete button in the infrastrucure editor form associated with the button 2. Upon deploy the `ondelete` entrypoint is executed and then all resources are released ``` id: 1 name: Incus Demo label: incus-demo-1 description: Extension description status: draft definition: kind: ExtensionDefinition schemaVersion: "1.1" name: Incus Platform label: incus extensionType: incus-app vendor: MetalSoft extensionVersion: "1.0" description: Enables the automatic deployment of private and shared incus clusters. Latest supported version is 6.4. icon: none dependencies: controllerVersion: 6.4+ osTemplates: - ubuntu-24-04 inputs: - label: compute_nodes name: Compute nodes count inputType: ExtensionInputInteger options: minValue: 1 maxValue: 100 deniedValues: - 2 - 4 - label: compute_nodes_type name: Compute nodes type inputType: ExtensionInputServerType options: {} - label: instance_array_name name: Name of the Incus instance array inputType: ExtensionInputString options: {} - label: compute_nodes_os_template name: Compute nodes OS template inputType: ExtensionInputOsTemplate options: osFamily: Linux - label: vars_debugging_enabled name: Variables debugging enabled inputType: ExtensionInputBoolean options: {} - label: cluster_enabled name: Cluster enabled inputType: ExtensionInputBoolean options: {} - label: branch_release name: Name of the release branch inputType: ExtensionInputString options: {} - label: ui_installing name: UI installing inputType: ExtensionInputBoolean options: {} - label: storage_driver name: Name of the storage driver inputType: ExtensionInputString options: {} - label: separate_api_and_cluster_traffic name: Separate the API and cluster traffic inputType: ExtensionInputBoolean options: {} - label: images_auto_update_interval name: The interval to auto update the images inputType: ExtensionInputInteger options: {} outputs: [] infrastructure: instanceArrays: - label: '#/input/instance_array_name' instanceCount: '#/input/compute_nodes' serverType: '#/input/compute_nodes_type' osTemplate: '#/input/compute_nodes_os_template' customVariables: - name: vars_debugging_enabled value: '#/input/vars_debugging_enabled' - name: cluster_enabled value: '#/input/cluster_enabled' - name: branch_release value: '#/input/branch_release' - name: ui_installing value: '#/input/ui_installing' - name: storage_driver value: '#/input/storage_driver' - name: separate_api_and_cluster_traffic value: '#/input/separate_api_and_cluster_traffic' - name: images_auto_update_interval value: '#/input/images_auto_update_interval' assets: - label: my_ansible_bundle_1 name: The Incus Ansible bundle assetType: AnsibleBundle url: https://repo.metalsoft.io/.extensions_ms/incus-v1alpha1.zip onCreate: postDeploy: - label: createStep taskType: ExtensionTaskAnsible options: asset: my_ansible_bundle_1 playbook: deploy.yaml onEdit: postDeploy: - label: scaleStep taskType: ExtensionTaskAnsible options: asset: my_ansible_bundle_1 playbook: scale.yaml - label: updateStep taskType: ExtensionTaskAnsible options: asset: my_ansible_bundle_1 playbook: upgrade.yaml ``` To manage the extensions a series of CLI commands are provided: ``` extension list - Lists all extensions. extension get - Get extension. extension create - Create extension. extension edit - Update extension. extension archive - Archive extension. extension publish - Publish extension. ``` It is not possible to delete an extension, only to archive it. Publishing an extension will allow users other than the owner to deploy it. Additionally a series of commands are provided to manipulate extension instances which are instances of the extension, deployed by users.