Reference Version 1.0Updated 26 Sep 2026

Complete minimal plugin

This example registers one working video effect with a stable package ID, one numeric parameter and two presets.

Package files

Create this directory:

woaby.minimal/
├── plugin.json
└── plugin.py

plugin.json

JSON
{
  "id": "woaby.minimal",
  "name": "Minimal Example",
  "version": "1.0.0",
  "author": "Woaby",
  "description": "Minimal video-effect example.",
  "entrypoint": "plugin.py",
  "enabled": true
}

plugin.py

Python
import numpy as np

from editor.plugin_api import PluginParameterDefinition


def process(frame, parameters, context):
    del context
    amount = float(parameters["amount"])
    if amount == 1.0:
        return frame
    output = frame.astype(np.float32) * amount
    return np.clip(output, 0, 255).astype(np.uint8)


def register(api):
    api.register_video_effect(
        effect_id="brightness_gain",
        name="Brightness Gain",
        processor=process,
        description="Multiplies RGB values by a constant amount.",
        parameters=(
            PluginParameterDefinition(
                key="amount",
                label="Amount",
                control="slider",
                default=1.0,
                minimum=0.0,
                maximum=2.0,
                step=0.01,
                unit="x",
            ),
        ),
        presets={
            "Neutral": {"amount": 1.0},
            "Lift": {"amount": 1.15},
        },
    )

Package and test the plugin

  1. Save both files in the plugin directory.
  2. Zip the directory.
  3. Install the ZIP through Plugin Manager.
  4. Add Brightness Gain to a compatible Track or Master FX chain.
  5. Change Amount and confirm that Preview and Render use the same effect behavior.

Tip: Add a bypass_when predicate for amount == 1.0 in a production version so the host can skip the neutral state before processing the frame.