Skip to content

Plugin Module

Every plugin is a class that extends FastPluggyBaseModule (a Pydantic BaseModel).

Minimal example

from fastpluggy.core.module_base import FastPluggyBaseModule
from .router import my_router

class MyPlugin(FastPluggyBaseModule):
    module_name    = "my_plugin"
    module_version = "1.0.0"
    module_router  = my_router

Field reference

Field Type Default Description
module_name str "" Unique identifier. Used in URLs, admin, and depends_on.
module_version str "0.0.0" Semantic version string.
module_menu_name str "" Label shown in the sidebar. Defaults to module_name.
module_menu_icon str "fas fa-cube" Icon CSS classes, e.g. "ti ti-star".
module_menu_type str \| None "main" Sidebar section: "main", "admin", or None to hide.
module_router APIRouter \| list \| callable None FastAPI router(s), or a zero-arg factory callable.
module_mount_url str \| None None Override mount URL. Default: /{module_type}/{module_name}.
module_settings type \| None None Pydantic BaseSettings class (not instance).
depends_on Dict[str, str] {} Plugin dependencies: {"other": ">=1.0.0"}.
extra_js_files List[str] [] JS file paths injected into every page <head>.
extra_css_files List[str] [] CSS file paths injected into every page <head>.

Plugin discovery

Plugins are loaded from two sources:

Folder scan

Place a directory with a plugin.py (containing a FastPluggyBaseModule subclass) under the configured plugins/ path:

plugins/
  my_plugin/
    __init__.py
    plugin.py     ← MyPlugin(FastPluggyBaseModule) must be importable here
    router/
    templates/
    static/

Entry points

Declare in pyproject.toml:

[project.entry-points."fastpluggy.plugins"]
my_plugin = "my_package.plugin:MyPlugin"

The framework walks up the directory tree from plugin.py to locate pyproject.toml / requirements.txt for dependency display.

Control which entry-point plugins are loaded with the FP_PLUGINS env var (comma-separated names, or "*" for all).