# How to add a new default plugin
 
To add a new default plugin for desktop:
- Add the plugin ID and pinned version to `defaultPlugins` object located in [desktopDefaultPluginsInfo.ts](https://github.com/laurent22/joplin/blob/eb7083d7888433ff6ef76ccfb7fb87ba951d513f/packages/lib/services/plugins/defaultPlugins/desktopDefaultPluginsInfo.ts#L5)
- If necessary, you can also add default settings for the plugins. 

- For example, if you wanted to add 2 default settings, `settingName1` and `settingName2`, then you will modify the `defaultPlugins` object in following way:

```
const defaultPlugins = {
    'samplePluginId': {
        settings: {
            'settingName1': 'setting-value1',
            'settingName2': 'setting-value2',
        },
    },
};
```

After this, add the commit, branch, and clone URL to be build from to `pluginRepositories.json`.

For example,
```json
{
	"plugin.id.here": {
		"cloneUrl": "https://example.com/plugin-repo/plugin-repo-here.git",
		"branch": "main",
		"commit": "840d2e84b70adf6de961e167dcd27ddad088b286"
	}
}
```

Or, alternatively, if the build process for the plugin is trusted (e.g. it uses [NPM trusted publishing](https://docs.npmjs.com/trusted-publishers)) and the plugin doesn't need to be patched,
1. Add the plugin to `devDependencies` in `package.json`.
2. Update `pluginRepositories.json`, replacing `""` with the plugin's NPM package name:
    ```json
    {
        "plugin.id.here": {
            "cloneUrl": "https://example.com/plugin-repo/plugin-repo-here.git",
            "package": ""
        }
    }
    ```

## Patching the plugin

Some plugins need patching. To create or update a plugin's patch, run the `patch-plugin` command in the `packages/default-plugins/` directory.

For example,
```shell
$ cd packages/default-plugins
$ yarn patch-plugin plugin.id.here
```

The script will create a temporary directory in which changes can be made. Do not stage the changes that should appear in the patch.

## Bundling of default plugins

Scripts for bundling default plugins are present in `packages/default-plugins/`.

These are run by the `app-desktop` package on a full `build` (e.g. on `postinstall`).


## Installing of default plugins

- All the functions related to default plugins are located in [defaultPluginsUtils.ts](https://github.com/laurent22/joplin/blob/eb7083d7888433ff6ef76ccfb7fb87ba951d513f/packages/lib/services/plugins/defaultPlugins/defaultPluginsUtils.ts)
- Default plugins are bundled with the app (included in the `build/` directory) and loaded from this directory.
- To allow loading `dev` and NPM versions of the plugin, default plugins are loaded after non-default plugins. The plugin service refuses to load additional copies of already-loaded plugins. As such, non-default plugins take precedence over default plugins.
- After loading is complete, we apply the default settings for each default plugin. Default settings are located in [desktopDefaultPluginsInfo.ts](https://github.com/laurent22/joplin/blob/eb7083d7888433ff6ef76ccfb7fb87ba951d513f/packages/lib/services/plugins/defaultPlugins/desktopDefaultPluginsInfo.ts). The `installedDefaultPlugins` setting is used to ensure that settings are only overridden once.
- If the plugin is already installed by the user, then we don't apply default settings to avoid overriding user's settings.