Plugins

Installing Plugins

Plugins extend FediSuite with additional features, for example Bluesky as another platform. Installation runs through Docker and requires no programming knowledge.

What are Plugins?

Plugins are optional extensions for FediSuite. Each plugin is a folder containing a plugin.json. All plugin folders live in the plugins/ directory next to your docker-compose.yml and are mounted into the containers as a volume at /app/plugins. The Docker image stays unchanged, so you can update FediSuite independently of your plugins.

The plugins are maintained in the FediSuite/FediSuite-Plugins-Repository (opens in new tab) repository on Forgejo. A single git clone fetches every plugin it contains. Newly detected plugins start out disabled. Only what an admin switches on in plugin management becomes active.

Included in the repository

fedisuite-plugin-bluesky v1.0.0

Bluesky as an additional platform: connect an account (handle, app password, optionally your own PDS host), publish posts, import history, and refresh statistics and posts.

my-plugin Template

An example for plugin developers, generated with the scaffold (a simple admin page). It also shows up in plugin management after cloning, but you do not need it in production and do not have to enable it.

Plugins are code: They run in the main FediSuite process, without a sandbox and with the same permissions as the application itself. Only install plugins from sources you trust. This also applies to plugins you write yourself.

Prerequisites

Before you install plugins, FediSuite should already be running and the following should be in place:

A running FediSuite installation Required

The self-hosting repository is set up, docker-compose.yml and .env are configured, and the containers are running. The Docker installation page explains how.

Docker and Docker Compose Required

The commands on this page use docker compose. Plugins need no additional software on the server.

Git Required

To clone and update the plugin repository. Check with: git --version

Write access to the FediSuite folder Required

You must be able to create a subfolder in the folder that contains docker-compose.yml.

An account with admin rights Required

Plugins can only be enabled and disabled in the admin area.

1

Clone the Plugin Repository

Change into your FediSuite installation folder, that is, the folder that contains your docker-compose.yml, and clone the plugin repository as a subfolder named plugins:

bash
cd /path/to/your/fedisuite-folder
git clone https://forge.chrislo.de/FediSuite/FediSuite-Plugins-Repository.git plugins
Important: The folder must be named plugins. The docker-compose.yml from the self-hosting repository mounts ./plugins. Without the target name at the end of the command, git clone creates a folder named FediSuite-Plugins-Repository, and the mount points at nothing. An existing empty plugins folder is fine, though: git clone fills it.

Then check that the folder was created correctly:

bash
ls -la plugins/

Among other things, you should see these entries:

Output (excerpt)
.git/
LICENSE
PLUGIN-AUTHORING.de.md
PLUGIN-AUTHORING.md
README.de.md
README.md
fedisuite-plugin-bluesky/
my-plugin/

Your folder structure now looks like this:

Folder structure

fedisuite/
├── .env
├── docker-compose.yml
├── logs/
├── postgres/
├── uploads/
└── plugins/                      ← newly cloned
    ├── .git/
    ├── fedisuite-plugin-bluesky/
    │   └── plugin.json
    ├── my-plugin/
    │   └── plugin.json
    ├── README.md
    └── README.de.md
2

Check docker-compose.yml

For the containers to see the plugins folder, it has to be mounted as a volume. The docker-compose.yml from the self-hosting repository already contains the mount for the three services app, worker1 and worker2 and also sets the plugin variables. All three containers read the plugin folder themselves at startup, which is why each of them needs the mount.

This is the excerpt for app in the default file (worker1 and worker2 contain the same plugin lines):

yaml
  app:
    image: ${FEDISUITE_IMAGE:-christinloehner/fedisuite:latest}
    ...
    environment:
      - PLUGINS_ENABLED=true
      - PLUGIN_SCAN_ON_START=true
      - PLUGIN_API_VERSION=1
    ...
    volumes:
      - ./uploads:/app/uploads
      - ./plugins:/app/plugins
      - ./logs:/app/logs

What do these entries mean?

./plugins

The folder on your server that you cloned in step 1. The dot stands for the directory that contains docker-compose.yml.

/app/plugins

The path inside the container where FediSuite looks for plugins. This path is fixed and must not be changed.

PLUGINS_ENABLED

Switches the plugin system on (default: true). With false (also 0, no or off), FediSuite loads no plugins.

PLUGIN_SCAN_ON_START

Reads the plugin folder at startup (default: true). With false it is not read and no plugins are loaded.

PLUGIN_API_VERSION

The plugin API version this FediSuite version expects (currently 1). Plugins with a different version are rejected. You should not change the value.

Use this command to check that the mount is active. The output lists the path to plugins and the target /app/plugins for each of the three services:

bash
docker compose config | grep plugins
Custom or older Compose file: If the mount is missing, add the line - ./plugins:/app/plugins to the volumes: section of app, worker1 and worker2, and copy the three plugin variables from the example above into the respective environment: section. You do not need a mount in the db container.
3

Restart FediSuite

FediSuite only reads the plugin folder when the containers start. After cloning, app, worker1 and worker2 therefore have to restart. If the Compose file already contained the mount and you have not changed it, restarting these containers is enough:

bash
docker compose restart app worker1 worker2

If you changed docker-compose.yml (for example by adding the mount), re-read it with this command. It recreates the affected containers:

bash
docker compose up -d

What happens at startup:

  • 1 The containers start and read the /app/plugins folder. The db container is left alone.
  • 2 FediSuite looks for a plugin.json in every subfolder. Folders without that file, such as .git, are skipped.
  • 3 The manifest of each plugin is checked: required fields, plugin API version, permissions and paths.
  • 4 New plugins are recorded in the database and initially kept as disabled. Plugins that were already enabled are started.
Careful with docker compose up -d: The Compose file from the self-hosting repository sets pull_policy: always. The command therefore also pulls a newer FediSuite image and updates FediSuite along the way. If you only want to re-read plugins, use docker compose restart app worker1 worker2, or pin a fixed image tag in your .env.
4

Enable the Plugin

Detected plugins are switched off after installation. Sign in as an admin, open Admin area / Plugins in the sidebar and click Enable on the plugin you want. The plugin starts right away in the running application, so the web interface needs no restart. More details are on the Plugin Management page.

Restart the workers: Every container reads the plugin state at startup. So that the workers also know a newly enabled plugin (for scheduled posts or statistics updates, for example), restart them afterwards: docker compose restart worker1 worker2. The same applies after disabling.

Verify Installation

After the restart you can see in the FediSuite interface or in the container logs whether the plugins were detected.

Option 1: In the FediSuite interface

1

Open FediSuite in your browser and sign in as an admin.

2

In the sidebar, open the "Admin area" section and then the "Plugins" entry.

3

The plugins from the folder should be listed as cards, with the status "Disabled" after the first installation.

4

For an entry with the status "Failed", the cause is shown in the expanded details.

Option 2: In the container logs

bash
docker compose logs app | grep -i plugin

After the scan, FediSuite reports something like Plugin discovery finished. 2 plugin directory/directories scanned. The number is the count of folders found that contain a plugin.json. If the mount is missing entirely, you will see Plugin directory /app/plugins does not exist instead. If the plugin system is switched off through PLUGINS_ENABLED or PLUGIN_SCAN_ON_START, a message names the variable concerned. Why an individual plugin does not start is not written to the logs. It appears as an error message in the expanded details of plugin management.

bash: general status check
docker compose ps                        # are all containers running?
docker compose config | grep plugins     # is the plugin mount active?
docker compose exec app ls /app/plugins  # what does the container see?

Applying Plugin Updates

Because the plugin folder is a Git repository, git pull fetches all changes. The containers then have to restart, since plugins are only re-read at startup. A plain docker compose up -d does not restart unchanged containers and is therefore not enough.

bash
cd plugins
git pull
cd ..
docker compose restart app worker1 worker2
Plugin updates are independent of FediSuite updates. When you update FediSuite (docker compose pull && docker compose up -d), the plugins/ folder stays as it is. If a new FediSuite version brings a different plugin API version, older plugins are rejected and show the status "Failed" until you update them.

Removing or Switching Off Plugins

There are three ways: disable a single plugin, delete a single plugin permanently, or switch off the whole plugin system.

Disable a single plugin

Click "Disable" on the plugin in plugin management. The files stay in place and you can enable the plugin again at any time. This is the normal choice when you only do not need a plugin for a while.

Remove a single plugin permanently

First disable the plugin in plugin management, then delete the plugin folder and restart the containers. The rm -rf command deletes the folder irreversibly, so check the path beforehand. On the next start the plugin no longer appears in plugin management.

bash, example: remove the Bluesky plugin
rm -rf plugins/fedisuite-plugin-bluesky
docker compose restart app worker1 worker2

Switch off the whole plugin system

In docker-compose.yml, set the variable PLUGINS_ENABLED to false for app, worker1 and worker2. The plugin folder and the mount can stay, but FediSuite will no longer load any plugins.

yaml: change the line for app, worker1 and worker2
    environment:
      - PLUGINS_ENABLED=false    # before: true
bash
docker compose up -d

Troubleshooting

If a plugin does not appear in plugin management after installation, work through this checklist:

Checklist: plugin does not show up

  • The folder is named exactly plugins and sits next to docker-compose.yml (not FediSuite-Plugins-Repository or similar).
  • The volume mount ./plugins:/app/plugins is set for app, worker1 and worker2.
  • PLUGINS_ENABLED and PLUGIN_SCAN_ON_START are not set to false.
  • The containers were restarted after cloning or changing anything, because plugins are only read at startup.
  • A plugin.json sits directly in the plugin subfolder (ls plugins/fedisuite-plugin-bluesky/). An additional folder level in between is not found.
  • The plugin is enabled in plugin management. A plugin's pages, widgets and connectors only appear once it is active.

Common causes at a glance

Symptom Cause Solution
Plugin missing in plugin management Containers not restarted after cloning, mount missing, or folder named differently docker compose restart app worker1 worker2, then docker compose exec app ls /app/plugins
Entry with the status "Failed" Invalid plugin.json, different plugin API version, missing permission, or an error in the plugin code at startup Read the error message in the expanded details of plugin management, update the plugin with git pull and restart
Folder is named FediSuite-Plugins-Repository git clone was run without a target folder name mv FediSuite-Plugins-Repository plugins, or clone again with: git clone … plugins
Container does not start YAML indentation error in docker-compose.yml docker compose config shows syntax errors
Plugin is active but has no effect on scheduled posts or refreshes The workers have not been restarted since enabling docker compose restart worker1 worker2
bash: diagnostic commands
ls -la plugins/                          # folder present and contents correct?
ls -la plugins/fedisuite-plugin-bluesky/ # plugin.json present?
docker compose config | grep plugins     # volume mount configured?
docker compose ps                        # are all containers running?
docker compose exec app ls /app/plugins  # what does the container see?
docker compose logs app                  # check app logs for errors
docker compose logs app | grep -i plugin # search for plugin messages