[Development Guides Home](/guides) >> [Guide to cPanel Plugins](/guides/guide-to-cpanel-plugins)

# Guide to cPanel Plugins - Add Plugins

## Introduction

Note:
* You must use this method when you install plugins.
* You can also create a cPanel plugin with WHM's [*cPanel Plugin File Generator*](https://docs.cpanel.net/whm/development/cpanel-plugin-file-generator/) interface (*WHM >> Home >> Development >> cPanel Plugin File Generator*)


cPanel & WHM uses an `install.json` file to add groups and features. This file passes information to cPanel's `dynamicui` files when you install your plugin. While you can also add items directly to Jupiter's `dynamicui` files, we **strongly** recommend that you use the `install.json` file method.

## The install.json file

To create an `install.json` file for your plugin, perform the following steps:

1. Create the `install.json` file.
2. [Add one or more groups](#add-groups) to the `install.json` file.
3. [Add one or more features](#add-features) to the `install.json` file.
4. [Add one or more Account Enhancements](#add-account-enhancements) to the `install.json` file.
5. Include [the complete `install.json` file](#example) in [your compressed installation file](/guides/guide-to-cpanel-plugins/).


Important:
* When you use the `install.json` file method, you **must** use [the `install_plugin` script](/guides/guide-to-cpanel-plugins/#the-install_plugin-script) to add your plugin to the cPanel interface.
* Due to the permissions that the `/usr/local/cpanel/scripts/install_plugin` script requires in order to access the necessary files, **only** the `root` user can run this script successfully.


## Add groups

Group entries in `install.json` files appear similar to the following example:


```
{
   "name" : "Custom Group",
   "icon" : "group.svg"
   "order" : 11,
   "type" : "group",
   "id" : "my_plugins",
   "implements" : "Filemanager_home"
}
```

Use the following parameters to configure groups:

| Parameter | Type | Description | Possible values | Example |
|  --- | --- | --- | --- | --- |
| `name` | *string* | **Required**  The name of the group, as it will display in the cPanel interface. In `dynamicui` files, this parameter becomes the `groupdesc` key. | A string value. | `Custom Group` |
| `icon` | *string* | **Required**  The icon file name. In `dynamicui` files, this parameter becomes the `file` key. | The icon's filename and file extension. **Note:** Jupiter group icons **must** be a `.svg` file type. Group icons **must** be 32x32 pixels.  | `group.svg` |
| `order` | *integer* | **Required**  The group's order in the cPanel interface. In `dynamicui` files, this parameter becomes the `grouporder` key. | An integer that represents the order in which the group displays. **Note:**  Groups with a lower `order` value display first. | `11` |
| `type` | *string* | **Required**  The item's type. This value determines whether the installation process converts the item into a group entry in the `dynamicui` files. | **Important:**  For groups, this value **must** be group. | `group` |
| `id` | *string* | **Required**  The group's internal name. In `dynamicui` files, this parameter becomes the `group` key. | A string value. | `my_plugins` |
| `key` | *string* | A key to uniquely identify cPanel interfaces and their associated assets for the [cPanel Analytics](https://docs.cpanel.net/knowledge-base/cpanel-product/cpanel-analytics/) program. In `dynamicui` files, this parameter becomes the `key` key. | A valid string. Generally, this value matches the item's `file` value. | `feature_name` |
| `implements` | *string* | The `app_key` value that the `create_user_session` and `get_users_links` functions use when you register the plugin. | The `app_key` value to override. **Note:** For a complete list of the variables to use for the `app_key` parameter, read our [Guide to cPanel Interface Customization - Appkeys](/guides/guide-to-cpanel-interface-customization-and-branding/guide-to-cpanel-interface-customization-appkeys) documentation. | `FileManager_Home` |


## Add features

Feature entries in `install.json` files appear similar to the following example:


```
{
   "icon" : "one.svg",
   "group_id" : "my_plugins",
   "order" : 10000,
   "name" : "Support",
   "type" : "link",
   "id" : "plugin_one",
   "uri" : "my_plugin_directory/index.live.pl",
   "target" : "_blank"
}
```

Use the following parameters to configure each feature:

| Parameter | Type | Description | Possible values | Example |
|  --- | --- | --- | --- | --- |
| `icon` | *string* | **Required**  The icon file name. In `dynamicui` files, this parameter becomes the `file` key. | The icon's filename and file extension. **Note:** Jupiter icons support either `.png` or `.svg`files. We recommend that you upload one of each that uses same root filename (for example, `file_manager.png` and `file_manager.svg`). If the `.svg` file is not available, cPanel will use the `.png` file. Icons **must** be 48x48 pixels.  | `one.svg` |
| `name` | *string* | **Required**  The name of the item, as it will display in the cPanel interface. In `dynamicui` files, this parameter becomes the `itemdesc` key. | A valid string. | `Support` |
| `order` | *integer* | **Required**  The item's order in the cPanel interface. In `dynamicui` files, this parameter becomes the `itemorder` key. | An integer that represents the order in which the item displays. **Note:**  Items with a lower `itemorder` value display first. | `10000` |
| `type` | *string* | **Required**  The item's type. This value determines whether the installation process converts the item into a group entry or an icon entry in the `dynamicui` files. | **Important:**  For features, this value **must** be `link`. | `link` |
| `id` | *string* | **Required**  The item's internal name. | A string value. **Note:**  This value can **only** contain letters, numbers, hyphens (`-`), and underscores (`_`). | `plugin_one` |
| `uri` | *string* | **Required**  The location to which the item links. In `dynamicui` files, this parameter becomes the `url` key.  **Note:**  In cPanel & WHM version 126, we removed Python2 support for the `cpsrvd` daemon. | A valid URL or a filepath relative to the `jupiter` theme's directory.  **Note:**  Your filepath **must** end with `live` and one of the following suffixes: `live.pl``live.rb``live.py``live.cgi``live.php` | `my_plugin_directory/index.live.pl` |
| `group_id` | *string* | **Required**  The group in which the item will appear. In `dynamicui` files, this parameter becomes the `group` key. | A valid group name.  In `install.json` files, this is the desired group's `id` value.  In `dynamicui` files, this is the desired group's `group` value. | `my_plugins` |
| `target` | *string* | Specifies where in the browser to open the plugin. | A valid HTML target value or frame name. | `_blank` |
| `featuremanager` | *integer* | Whether to register this item in WHM's [*Feature Manager*](https://docs.cpanel.net/whm/packages/feature-manager/) interface (*WHM >> Home >> Packages >> Feature Manager*). This parameter defaults to `1`. | `1` — Register this item in the *Feature Manager* interface.`0` — Do **not** register this item in the *Feature Manager* interface. | `1` |
| `feature` | *string* | The plugin's name. This parameter defaults to the `id` parameter's value. | A string value. **Note:**  This value can **only** contain letters, numbers, hyphens (`-`), and underscores (`_`). | `examplefeature` |
| `description` | *string* | The plugin's description. This parameter defaults to the `name` parameter's value. | A string value. | `A test plugin.` |
| `key` | *string* | A key to uniquely identify cPanel interfaces and their associated assets for the [cPanel Analytics](https://docs.cpanel.net/knowledge-base/cpanel-product/cpanel-analytics/) program. In `dynamicui` files, this parameter becomes the `key` key. | A valid string. Generally, this value matches the item's `file` value. | `feature_name` |


### Add features to an existing group

You can also add plugin features to groups that already exist in Jupiter. Use the following group names to add a feature to an existing group:

* `files`
* `databases`
* `domains`
* `email`
* `metrics`
* `security`
* `software`
* `advanced`
* `preferences`


## Example

The following example file adds the *My Group* group to the cPanel interface, with icons that link to the *Plugin One* and *Plugin Two* interfaces:


```
[
    {
      "icon" : "group.svg"
       "order" : 11,
       "name" : "My Group",
       "type" : "group",
       "id" : "my_plugins"
    },
    {
       "icon" : "one.svg",
       "group_id" : "my_plugins",
       "order" : 1,
       "name" : "Plugin One",
       "type" : "link",
       "id" : "plugin_one",
       "key" : "feature_name",
       "uri" : "my_plugin_directory/index.live.pl",
       "featuremanager" : 1,
       "feature" : "examplefeature",
       "description" : "A test plugin."
    },
    {
       "icon" : "two.svg",
       "group_id" : "my_plugins",
       "order" : 2,
       "name" : "Plugin Two",
       "type" : "link",
       "id" : "plugin_two",
       "key" : "feature_name",
       "uri" : "my_plugin_directory/index.html.pl",
       "featuremanager" : 1,
       "feature" : "plugin_two",
       "description" : "Plugin Two"
    }
]
```

## Add Account Enhancements

[Account Enhancement](https://go.cpanel.net/account-enhancements) entries in `install.json` files appear similar to the following example:


```
{
    "type": "account_enhancement",
    "name": "My Plugin Deluxe Edition",
    "id": "my-plugin-deluxe-edition",
    "plugin_id": "my_plugin"
}
```

Use the following parameters to configure each enhancement:

| Parameter | Type | Description | Possible values | Example |
|  --- | --- | --- | --- | --- |
| `name` | *string* | **Required**  The name of the enhancement, as it will display in the cPanel interface. | A valid string. | `My Plugin Deluxe` |
| `type` | *string* | **Required**  The item's type. | `account_enhancement` | `account_enhancement` |
| `id` | *string* | **Required**  The ID of the enhancement. | A valid string. | `my-plugin-deluxe-edition` |
| `plugin_id` | *string* | **Required**  The ID of the plugin that supports the enhancement. Should match the groups ID. | A valid string. | `my_plugin` |


## Create a plugin interface

To create a plugin that integrates seamlessly with the Jupiter interface, read the following tutorials:

* [Create a New cPanel Interface in PHP](/guides/quickstart-development-guide/tutorial-create-a-new-cpanel-interface-in-php)
* [Create a New cPanel Interface in Template Toolkit](/guides/quickstart-development-guide/tutorial-create-a-new-cpanel-interface)