View .md

Plugins

How FeatherPanel plugins work. Install from the marketplace, a file or a URL, manage settings and visibility, and the layout, conf.yml and entry class of a plugin.

On this page

Plugins (also called addons) add backend routes, event handlers, cron jobs, CLI commands, database tables, frontend pages, sidebar entries and dashboard widgets to the panel without patching its code.

Install a plugin

Open Admin > Plugins. You can:

  • browse and install from the online registry (FeatherCloud marketplace), search by tag and see popular packages,
  • upload an .fpa package,
  • install from a URL.

Before installing from the registry the panel checks the package’s requirements. After install you can change the plugin’s settings, hide its frontend pages from some users, limit its server sidebar entries to certain spells, export it as a package, resync its file links or uninstall it. Each action needs admin.plugins.view or admin.plugins.manage.

Anatomy of a plugin

A plugin is a directory in backend/storage/addons/ named after its identifier:

demoshowcase/
├── conf.yml
├── DemoShowcase.php
└── Frontend/
    ├── sidebar.json
    ├── widgets.json
    └── Components/demoshowcase/dist/*.html

conf.yml

plugin:
  name: DemoStatus
  identifier: demostatus
  description: 'Status showcase'
  flags:
    - hasEvents
  version: 1.0.0
  target: v2
  author:
    - Your Name
  icon: 'https://example.com/icon.png'
  requiredConfigs: {}
  dependencies:
    - php=8.3
    - php-ext=pdo
config: {}
KeyNotes
name, identifier, description, version, target, iconRequired strings. The identifier may only contain letters, digits and _.
flagsRequired list. Allowed: hasInstallScript, hasRemovalScript, hasUpdateScript, developerIgnoreInstallScript, developerEscalateInstallScript, userEscalateInstallScript, hasEvents.
authorRequired list of names.
dependenciesRequired list. Entries are php=, php-ext=, composer= or plugin=. The plugin does not load if one is missing.
requiredConfigsRequired. Settings the admin must fill in before the plugin works.
plugin_cloud_id, minimum_panel_version, maximum_panel_versionOptional.

Entry class

The entry class lives in the namespace App\Addons\<identifier>, has the same name as plugin.name, and implements App\Plugins\AppPlugin:

<?php

namespace App\Addons\demostatus;

use App\Plugins\AppPlugin;
use App\Plugins\PluginEvents;

class DemoStatus implements AppPlugin
{
    public static function processEvents(PluginEvents $event): void
    {
        // Subscribe to panel events here.
    }

    public static function pluginInstall(): void
    {
    }

    public static function pluginUninstall(): void
    {
    }
}

An optional pluginUpdate(?string $oldVersion, ?string $newVersion) method runs on updates. If the name, class and namespace do not match, the panel looks for a single AppPlugin class in the plugin root, and skips the plugin with a log entry when it finds none.

Other directories

DirectoryPurpose
Routes/Backend API routes
Commands/Commands added to the panel CLI
Migrations/SQL migrations for the plugin’s tables
Cron/Jobs picked up by the cron runner, see Cron and workers
Frontend/sidebar.jsonPages in the client, admin and server sidebars
Frontend/widgets.jsonWidgets placed on panel pages
Frontend/Components/Built HTML for those pages and widgets, loaded in an iframe

Develop a plugin

Read these in order the first time, then use them as a reference:

StepPage
1. Build a working plugin in a few minutesBuild your first plugin
2. Learn the folder layoutPlugin structure
3. Describe the pluginManifest (conf.yml) and Settings
4. Run code when things happenLifecycle and events and the event reference
5. Add an APIRoutes and permissions and Middleware and router hooks
6. Add pages and widgetsFrontend and Power SDK, Widget slots and Themes and UI packs
7. Store dataMigrations and storage
8. Run background workCron jobs and CLI commands
9. Ship itPackaging and publishing
When something breaksDebugging plugins and the Plugin FAQ

Examples has complete plugins to copy from. The panel also ships its own developer docs, icanhasfeatherpanel, at /icanhasfeatherpanel/ on every panel.

Reference

Frequently asked questions

Where are plugins stored?

In backend/storage/addons/<identifier>. In the Docker backend container that is /var/www/html/storage/addons, backed by the featherpanel_addons volume, so plugins survive container updates.

What is an .fpa file?

The package format for FeatherPanel addons, a zip archive that may be password protected. Marketplace downloads and exports use it, and the admin area can install one from an upload or a URL.