How Plugins Work
Plugins are standalone ES modules (.js files) that export a meta object and a setup function.
Loading Process
Plugin Manager Check
If the Plugin Manager is missing or disabled, it’s auto-installed/enabled from its default GitHub URL.
Import
Each plugin is loaded via dynamic
import(). For cross-origin URLs, the code is fetched and loaded via a blob URL (handles CORS).Validation
Core checks that the module exports
meta (with id, name, version) and setup (a function).The meta Object
| Field | Required | Description |
|---|---|---|
id | ✅ | Unique identifier. Use kebab-case |
name | ✅ | Display name in Plugin Manager |
version | ✅ | Semantic version (e.g., "1.0.0") |
compat | ❌ | Core version compatibility range (e.g., ">=3.3.0") |
Plugin Management
Installing
Toggling
Deleting
Reloading
Restarting
Unloading
When a plugin is disabled or deleted:plugin.teardown()is called (if exported)- The plugin’s container is removed from the DOM
plugin:unloadedevent is emitted
Plugin Manager
The Plugin Manager is itself a plugin. It provides:- Installed Plugins tab — view, toggle, delete installed plugins
- Community Store tab — browse and install from GitHub
- Manual Install — paste any URL to install a plugin
- Docs link — links to the official documentation
Plugin Manager Features
- Cannot be deleted or paused (system protected)
- Auto-installed on first boot
- Auto-re-enabled if disabled
- Registers its own UI slot system via
api.registerUI()
Security
Trusted Sources
Plugins are checked against allowed sources:| Source | Description |
|---|---|
system | Core/official plugins |
registry | Installed from the Community Store |
manual | Installed via URL by the user |
Permissions
The Plugin Manager gets elevated permissions to manage other plugins. See Permissions for details.Setup Timeout
Each plugin has a 5-second timeout for itssetup() function. If it exceeds this, the plugin is considered failed and an error notification is shown.