# Manage installed addons

> Turn plugins, mods and datapacks on or off, update them to newer builds and remove them from your server.

Source: https://www.coritan.com/docs/managed-containers/software/installed-addons/

In the dashboard:

- /dashboard/servers/…/software: https://www.coritan.com/dashboard/servers

The **Installed addons** panel on a server's **Software** tab lists every plugin, mod and datapack in the folders your server loads from. It shows the ones you installed from the [Marketplace](/docs/managed-containers/software/plugins-and-mods/) and the ones you uploaded yourself. From the panel you can turn an addon off without deleting it, update it to a newer build and remove it.

The panel is there for Java software. A Bedrock server manages its content on the **Packs** panel instead: see [Manage Bedrock packs](/docs/managed-containers/software/bedrock-packs/).

## Before you begin

- The server must be installed, because the panel reads the files on it.
- On a server someone shared with you, the Install software permission lets you see the list, turn addons on or off and update them. Removing an addon or forgetting a record needs `software.delete`, which the dashboard's permission list does not offer, so the owner can grant it only [through the API](/docs/managed-containers/users/#with-the-api).

The folders the panel reads depend on the server's software:

| Software | Folders |
| --- | --- |
| Plugin servers, such as Paper, Purpur and Spigot | `plugins` and the world's `datapacks` |
| Mod loaders: Fabric, Quilt, Forge and NeoForge | `mods` and the world's `datapacks` |
| Arclight, Mohist and Magma, which load both | `plugins`, `mods` and the world's `datapacks` |
| Vanilla | The world's `datapacks` |
| Proxies, such as Velocity and BungeeCord | `plugins` |

The world's datapack folder follows `level-name` in `server.properties`: `world/datapacks` by default, or `survival/datapacks` for a world called `survival`.

## Read the list

1. In the [dashboard](https://www.coritan.com/dashboard/servers), go to **Container Apps** and open the server, then the **Software** tab.
2. Select **Installed addons**.

Each kind of addon has a card, **Plugins**, **Mods** or **Datapacks**, that names its folder and counts the files in it. Addons that are on come first, in name order, then the ones that are off. Each row shows the addon's name, the version when the Marketplace installed it, its path, its size and when it last changed.

The panel lists only files the server loads: `.jar` files for plugins and mods, and `.zip` files and folders for datapacks. A plugin's own data folder, such as `plugins/LuckPerms`, and any other file in the folder are left out. Manage those in the [Files tab](/docs/managed-containers/files/).

A badge on a row tells you more:

**Disabled**
: The file name ends in `.disabled`, so the server does not load it.

**Uploaded by hand**
: The Marketplace did not install this file. Files you upload or copy in yourself, over [SFTP](/docs/managed-containers/sftp/) or an [import](/docs/managed-containers/import/), show this badge, and so do the mods a modpack brings. We cannot check them for updates.

**Update available**
: A newer build fits your server. The badge names the version when it can, such as `Update to 2.11.0`.

**Files missing**
: The Marketplace installed this addon, but its file is no longer in the folder. Someone deleted or renamed it outside this panel.

The bar above the cards counts the updates, such as `2 updates available`. The refresh button next to it reads the folders again.

## Turn an addon off or on

1. On the **Installed addons** panel, find the addon's row.
2. Turn off the switch at the end of the row. Turn it on again to switch the addon back on.

We rename the file: `EssentialsX-2.20.1.jar` becomes `EssentialsX-2.20.1.jar.disabled`, and the server skips it. A running server keeps what it loaded, so the change applies the next time the server starts. Restart it from the [console](/docs/managed-containers/console/) when you are ready.

A datapack folder has no switch, because the game loads a folder with a `pack.mcmeta` whatever it is called. To be able to switch it off, replace the folder with the datapack's `.zip` file.

## Update an addon

We check the addons the Marketplace installed against their source. An update is a build that fits your server's software and Minecraft version and is newer than the one on disk. We prefer release builds over beta and alpha builds when the source has both.

1. On the **Installed addons** panel, find a row with an update badge.
2. Select **Update**.

We queue an install job, which appears in the jobs card at the top of the **Software** tab. The job removes the old build's file and downloads the new build in its place. An addon you had turned off stays off after the update. The new build loads the next time the server starts.

To update several addons at once, or to see every update across the server, use the [Updates tab](/docs/managed-containers/updates/).

## Remove an addon

1. On the **Installed addons** panel, select the bin icon at the end of the addon's row.
2. Select **Remove addon**.

We delete the file. For an addon the Marketplace installed, we delete every file that install wrote and drop our record of it. The addon's data folder, such as `plugins/EssentialsX`, stays: delete it in the [Files tab](/docs/managed-containers/files/) if you no longer need its settings.

Removing does not stop the server. A running server keeps the addon loaded until it restarts.

## Forget a missing addon

A row with the **Files missing** badge has a **Forget** button in place of the switch. Select **Forget** to drop our record of the install. Nothing on the server changes, and the row disappears from the list.

## Result

A message confirms each change, such as `EssentialsX turned off for the next start.`, `EssentialsX removed.`, `Record dropped.` or `Updating to 2.11.0.` An update's job shows as `Queued`, then `Running` with its progress, then `Succeeded` or `Failed`.

## Troubleshooting

**No addon folders**
: The server's software loads no plugins, mods or datapacks, as with some proxies. To add some, [change the software](/docs/managed-containers/software/).

`Could not read the addon folders. Check that the server is installed.`
: We could not list the server's files. Check that the server finished installing and is not suspended, then try again.

`A datapack folder loads whatever it is named; delete it or zip it to be able to switch it off`
: Datapack folders cannot be switched off by renaming. Remove the folder, or replace it with the datapack's `.zip` file.

`EssentialsX-2.20.1.jar.disabled already exists; remove one copy first`
: The folder holds the same file both on and off. Remove one of the two copies.

`That file is no longer on the server`
: Someone moved or deleted the file since the list loaded. Select the refresh button to read the folder again.

`Cannot uninstall while a replace, wipe, or software change is in progress. Wait for it to finish or cancel it first.`
: A job that replaces the server's files is running. Wait for it in the jobs card, or select **Cancel job** there, then remove the addon.

`That software is currently being installed. Cancel the install first, or wait for it to finish.`
: The same addon has an install or update job running. Let it finish, or cancel it, then try again.

`Could not delete installed files under /plugins: …`
: The server refused the deletion. We keep the record so you can try again, or delete the files in the [Files tab](/docs/managed-containers/files/).

`This record has no removable files; delete them in the file manager instead`
: Our record of the install does not name its files. Delete them in the [Files tab](/docs/managed-containers/files/), then select **Forget** on the row, or refresh the list.

The update job fails
: The job's row in the jobs card shows the reason. Select **Try again** to queue the same update again. A source that no longer offers the build fails with a message from that source.

`Too many requests for this action. Please wait and try again.`
: A server accepts 8 software actions from one account in 10 minutes. Updates count towards that, along with installs and software changes. The response says how many seconds to wait.

## Related

- [Install plugins, mods and modpacks](/docs/managed-containers/software/plugins-and-mods/)
- [Install server updates](/docs/managed-containers/updates/)
- [Start a server in safe mode](/docs/managed-containers/software/safe-mode/)
- [Manage files](/docs/managed-containers/files/)

## With the API

`GET /api/v1/client/servers/{uuid}/software/addons` returns the inventory for every addon kind the server loads. Add `?kind=plugin`, `mod` or `datapack` for one kind. Under `kinds`, each kind has its `directory`, its `items` and the `missing` records whose files are gone. `supported_kinds` lists the kinds the server loads.

```json
{
  "kinds": {
    "plugin": {
      "kind": "plugin",
      "directory": "/plugins",
      "items": [
        {
          "kind": "plugin",
          "name": "LuckPerms",
          "filename": "LuckPerms-Bukkit-5.4.137.jar",
          "path": "/plugins/LuckPerms-Bukkit-5.4.137.jar",
          "directory": false,
          "size_bytes": 1432118,
          "enabled": true,
          "can_toggle": true,
          "tracked": true,
          "missing": false,
          "record_uuid": "5b1f7a0e-2c4d-4e8a-9b3f-6d2a1c0e7f45",
          "version_name": "5.4.137"
        }
      ],
      "missing": []
    }
  },
  "supported_kinds": ["plugin", "datapack"]
}
```

An item also carries `modified_at`, and for a tracked addon `source_uuid`, `source_name`, `identifier`, `display_name`, `version`, `icon_url` and `project_url`. An untracked item has `tracked` set to `false` and `null` in those fields. Asking for a kind the server does not load returns empty `kinds` and names it in `unsupported`.

Turn an addon off, or on with `"enabled": true`:

```bash
curl -X POST https://api.coritan.com/api/v1/client/servers/$SERVER/software/addons/toggle \
  -H "Authorization: Bearer $CORITAN_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"path": "/plugins/EssentialsX-2.20.1.jar", "enabled": false}'
```

The response gives the new `path`, the `previous_path`, `enabled`, `changed` and `kind`. A file that is already in the state you asked for answers with `changed` set to `false`. The path must name a file directly inside one of the server's addon folders; any other path answers `400` with `That path is not inside an addon folder on this server`.

| Request | What it does |
| --- | --- |
| `POST /software/addons/remove` | Deletes the addon at `{"path": "…"}`. A tracked addon goes through the uninstall and the response has `deleted`, `uuid`, `identifier`, `path`, `kind` and `tracked`. |
| `DELETE /software/addons/records/{record_uuid}` | Drops the record and leaves the files alone. Returns `{"forgotten": true, "uuid": "…"}`. The file, if it is still there, then lists as uploaded by hand. |
| `GET /software/updates` | Checks the tracked addons for updates. Returns `updates` and `available`, the number with an update. Add `kind` for one kind, and `include_current=true` to list addons already on the newest build too. |
| `POST /software/{record_uuid}/update` | Queues the update. Send `{"version": "…"}` with a version id from `latest_version`, or leave the body out for the newest build. Returns the install job. |

The paths are relative to `/api/v1/client/servers/{uuid}`. The [Updates tab page](/docs/managed-containers/updates/#with-the-api) describes each entry in `updates`. Server software and modpacks are never listed there, and updating one answers `400`: change them from [Server software](/docs/managed-containers/software/) instead.

The install job has a `uuid`, `kind`, `mode` (`update`), `status`, `stage`, `progress` from 0 to 100, `requested_version`, `resolved_version` once known, and `error` when it fails. Follow it with `GET /software/installs/{install_uuid}`, as [Change the server software](/docs/managed-containers/software/#with-the-api) explains. Sending the same update while one is queued or running returns the job already in progress.

A missing record answers `404` with `Installed software not found`. A job that blocks the change answers `409` with the messages under [Troubleshooting](#troubleshooting). Any other refusal answers `400`.

On a server shared with you, listing and checking for updates need `software.read`, toggling and updating need `software.install`, and removing and forgetting need `software.delete`.

## API

- `GET /api/v1/client/servers/{uuid}/software/addons`: Every addon in the folders the server loads from, tracked or hand-uploaded (https://www.coritan.com/docs/api/reference/client/container-apps/servers-software/#op-get-api-v1-client-servers-uuid-software-addons)
- `DELETE /api/v1/client/servers/{uuid}/software/addons/records/{record_uuid}`: Drop a tracking record whose files are gone, without touching the disk (https://www.coritan.com/docs/api/reference/client/container-apps/servers-software/#op-delete-api-v1-client-servers-uuid-software-addons-records-record-uuid)
- `POST /api/v1/client/servers/{uuid}/software/addons/remove`: Delete one addon from disk, through the tracked uninstall when it has a record (https://www.coritan.com/docs/api/reference/client/container-apps/servers-software/#op-post-api-v1-client-servers-uuid-software-addons-remove)
- `POST /api/v1/client/servers/{uuid}/software/addons/toggle`: Switch one addon file on or off (Foo.jar <- Foo.jar.disabled) (https://www.coritan.com/docs/api/reference/client/container-apps/servers-software/#op-post-api-v1-client-servers-uuid-software-addons-toggle)
- `GET /api/v1/client/servers/{uuid}/software/updates`: Newer compatible builds for the addons the marketplace installed (https://www.coritan.com/docs/api/reference/client/container-apps/servers-software/#op-get-api-v1-client-servers-uuid-software-updates)
- `POST /api/v1/client/servers/{uuid}/software/{record_uuid}/update`: Queue an in-place update: the old file is removed, the new build installed (https://www.coritan.com/docs/api/reference/client/container-apps/servers-software/#op-post-api-v1-client-servers-uuid-software-record-uuid-update)
