# Publishing your plugins

Do you want to share your IDA plugin with Hex-Rays community?\
To have your plugin featured in the official [Hex-Rays plugin repository](https://plugins.hex-rays.com/), follow our guide for submitting it through [My Hex-Rays](https://my.hex-rays.com/dashboard/my-plugins). The portal serves as a one-stop shop for plugin submission and maintenance, allowing you to manage and track all your submitted plugins in one place.

## Pre-submission checklist

Before submitting your plugin to the Hex-Rays repository, make sure the following requirements are met:

1. Your plugin must be hosted in a **public GitHub repository** and include:

* A `README.md` file with plugin overview, installation instructions and usage examples.
* An `ida-plugin.json` file containing the required metadata. See our [guidelines](#define-plugin-metadata-with-ida-pluginjson) on details.

2. The plugin has been tested and confirmed compatible with the latest IDA version.

## Define plugin metadata with `ida-plugin.json`

The `ida-plugin.json` eases the organization of your plugin files (allows it to be self-contained in its own sub-directory) and smooths the process for accepting your plugin into our official plugin repository if you decide to share it with the community.

To work properly, the `ida-plugin.json` file must contain at the very least the `IDAMetadataDescriptorVersion` field as well as a `plugin` object containing the fields described below.

Example of the `ida-plugin.json` file:

```json
{
  "IDAMetadataDescriptorVersion": 1,
  "plugin": {
    "name": "My First Plugin",
    "entryPoint": "my-first-plugin",
    "categories": ["disassembly-and-processor-modules"],
    "logoPath": "logo.png",
    "idaVersions": "9.1",
    "description" : "The exemplary description of your plugin's functionality",
    "version": "1.1.2"
  }
}

```

### Fields description

| Field         | Description                                                                                                                                                                                                                                                                                                                                                                                                                         |
| ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `name`        | The `name` will be used to identify the plugin and also generate a namespace name for it if necessary (e.g., an IDAPython plugin). The namespace name is generated by converting all non alphanumeric characters of the plugin name to underscores (`_`) and prepending `__plugins__` to it. For example "my plugin" would become `__plugins__my_plugin`.                                                                           |
| `entryPoint`  | The filename of the "main" file for the plugin. It should be stored in the same directory as its `ida-plugin.json` file. If the `entryPoint` has no file extension, IDA will assume it is a native plugin and append the appropriate file extension for dynamic shared objects for the host platform (`.dll`, `.so`, `.dylib`). For IDAPython plugins, this should typically be a `.py` file (e.g., `my-first-plugin.py`).          |
| `categories`  | Select **at least one** category to improve your plugin’s discoverability: `disassembly-and-processor-modules`, `file-parsers-and-loaders`, `decompilation`, `debugging-and-tracing`, `deobfuscation`, `collaboration-and-productivity`, `integration-with-third-parties-interoperability`,`api-scripting-and-automation`, `ui-ux-and-visualization`, `malware-analysis`, `vulnerability-research-and-exploit-development`, `other` |
| `logoPath`    | Include an image to visually represent your plugin on its page at [plugins.hex-rays.com](https://plugins.hex-rays.com). This should be a relative path to an image file within your plugin’s repository. The recommended aspect ratio for the image is 16:9.                                                                                                                                                                        |
| `idaVersions` | Declare which versions of IDA your plugin supports. You can specify a single version (e.g., `9.0`) or a version range (e.g., `>=9.0`) using the [semantic versioning](https://github.com/npm/node-semver#readme) scheme.                                                                                                                                                                                                            |
| `description` | Summarize your plugin functionality.                                                                                                                                                                                                                                                                                                                                                                                                |
| `version`     | Specify the version of your plugin. It must follow the `x.y.z` format (e.g., `1.0.0`).                                                                                                                                                                                                                                                                                                                                              |

## Submission process

### Step 1: Submit a plugin via My Hex-Rays portal

1. Navigate to [My Plugins](https://my.hex-rays.com/dashboard/my-plugins) tab in My Hex-Rays portal.
2. Click on **Submit a Plugin** button.
3. In the new dialog:

* insert the URL for your public GitHub repository (1)
* accept the T\&C and confirm your ownership (2)\
  then click **Review**.

![Submit a plugin](https://2148706108-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI8M5PHYsEEeI7qsOcPAD%2Fuploads%2Fgit-blob-65b9ae78d9bf915073a82417cbf436e36ec1213c%2Fsubmit-a-plugin.png?alt=media)

4. If everything looks correct in the plugin details summary, click **Submit Plugin** to finalize your submission.

![Confirm submission](https://2148706108-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI8M5PHYsEEeI7qsOcPAD%2Fuploads%2Fgit-blob-b481d48c6e3b6c0cfa409f8ddb1b4c94829c104e%2Fconfirm-submission.png?alt=media)

### Step 2: Plugin review

* Once submitted, your plugin status will change to *Pending* while it is reviewed by the Hex-Rays team.
* If approved, the status will change to *Accepted*.
* If your plugin becomes rejected, you'll be notified by email with further details.

![My plugins view](https://2148706108-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI8M5PHYsEEeI7qsOcPAD%2Fuploads%2Fgit-blob-4de5fcbade50066f3b4ce15d0f613b9cad9aa33f%2Fmy-plugins.png?alt=media)

## Plugins management

### Updating your plugin details

To reflect changes—such as updated categories—on your plugin’s page immediately:

1. Navigate to [My Plugins](https://my.hex-rays.com/dashboard/my-plugins) tab in My Hex-Rays portal.
2. Find your plugin in the list and click **View Details**.
3. In the dialog, click **Refresh** to update the plugin information (this action sets the plugin's status back to *Pending*) and click **Update Plugin** to confirm changes.

The changes in your plugin `README.md` and `ida-plugin.json` files are monitored - when they get detected, your plugin status will change automatically to *Pending*.

### Removing your plugin

To remove your plugin from the Hex-Rays plugin repository:

1. Navigate to [My Plugins](https://my.hex-rays.com/dashboard/my-plugins) tab in My Hex-Rays portal.
2. Locate the plugin you want to remove.
3. Click **Unpublish** and confirm your decision.
