A Node module plus a sandboxed UI.
The Node side talks to your clusters through a permission-gated context. The UI side runs in a sandboxed frame and only reaches what the manifest declares.
Register pages, dashboard widgets, sidebar entries, modals and resource actions
Declare settings in the manifest and Shoal draws the settings form for you
Store data per plugin and show notifications in the app
Installed plugins run their Node code in a separate process
// plugin.json
{
"id": "my-first-plugin",
"name": "My First Plugin",
"version": "1.0.0",
"description": "Shows quick stats for the active cluster",
"author": "You",
"main": "index.js",
"renderer": "renderer.js",
"permissions": ["kubernetes", "ui", "storage"],
"license": { "type": "free", "spdx": "MIT" }
}