Aphelion Editor plugins
A plugin adds a node type to the editor. It is an ordinary Python class that receives a frame and returns a modified one, and once it is in the right folder it appears in the node menu next to the built-ins — with its own inspector properties and its own entry in the search palette.
What a plugin can do
- Add an effect nodeCustom image processing that is not in the built-in library: a specific blur, a bespoke colour transform, a procedural pattern, an analysis pass.
- Add a generatorA node that produces a frame from nothing, such as a pattern, a chart or a procedurally drawn element.
- Expose propertiesNumber, slider, toggle, choice, colour and text properties, all of which the inspector renders and the timeline can keyframe.
- Publish status and errorsA plugin can report a problem through the same error path a built-in node uses, so a failure surfaces in the editor rather than as a silent black frame.
- Ship as a packageA plugin can be a single Python file or a packaged wheel with its own dependencies, which matters as soon as it needs a library the editor does not bundle.
- Be enabled per projectPlugins are enabled, disabled and reloaded from Preferences without restarting the editor, so iterating on one is a save-and-reload loop.
What a plugin looks like
Plugins import aphelion_sdk and subclass the same effect base the built-in nodes use. The base handles socket setup, property registration and the frame contract, so a plugin author writes the operation and nothing else.
The frame contract is deliberately narrow: a plugin receives a frame as a NumPy array and returns one of the same shape. That is the whole surface a plugin has to agree on, which is why the same class works whether it is processing a 960px proxy during playback or a full-resolution frame during export.
import aphelion_sdk
@aphelion_sdk.register_plugin
class GrayscaleEffect(aphelion_sdk.VideoEffectPlugin):
plugin_name = "Grayscale"
def setup_effect_properties(self) -> None:
self.set_property(
"amount",
aphelion_sdk.slider_property(100, 0, 100, label="Amount", suffix="%"),
)
def process_frame(
self,
frame: aphelion_sdk.Frame,
_frame_num: int,
) -> aphelion_sdk.Frame:
amount = self.float_value("amount", 100.0) / 100.0
luma = (
frame[..., 0] * 0.2126 + frame[..., 1] * 0.7152 + frame[..., 2] * 0.0722
)
gray = luma[..., None].repeat(3, axis=2)
return frame * (1.0 - amount) + gray * amount
Installing a plugin
A single file or folder
Drop the Python module into the editor's plugins/ directory, or into userdata/plugins/ to keep it out of the application folder. The user location is the better choice for anything you want to survive an upgrade.
A packaged plugin
If the plugin ships as a wheel — for instance because it depends on a library the editor does not bundle — install it into the editor's environment and the loader picks it up on the next scan.
Install the SDK into the editor's environment
pip install aphelion-plugin-sdkOr install from a checkout of the SDK repository
pip install -e ./aphelion-sdkThe Windows installer already bundles the SDK wheel and a helper script, so plugin authors on Windows do not need a separate download.
How plugins are found and loaded
The editor scans its plugin directories at startup and builds a list of available plugins. Each one is listed in Preferences under Plugins with an enable toggle and a reload action. Disabling a plugin removes its nodes from the menu; reloading re-imports the module so a change to the file takes effect without restarting.
A plugin that fails to import is reported as a failed plugin rather than crashing the editor, so a broken third-party file does not take the whole application with it.
Plugin discovery order and Preferences · Packaging plugins for distribution · Architecture: how nodes are registered
Getting the SDK
The SDK is published as aphelion-plugin-sdk. Its documentation covers the video-effect base classes, the widget primitives plugin UIs are built from, and how to package a plugin so someone else can install it.