English · 简体中文
This guide explains how to develop and publish an addon for OpenKuboard.
Each addon corresponds to a directory in the repository, named:
<addon-id>.addons.openkuboard.github.io/<version>/
.addons.openkuboard.github.io.1.0.0, v3.0.1) that matches the version field in addon.json.A version directory may contain:
| File / Dir | Required | Description |
|---|---|---|
addon.json |
Yes | Addon manifest (entry point) |
README.md |
No | Addon documentation |
initialize.js |
No | Frontend initialization script |
extensions.json |
No | Context-menu extension definitions |
alert-config.json |
No | Default alert configuration |
alert-config-schema.json |
No | Alert config UI schema |
k8s/ |
No | Kubernetes manifests (organized by component) |
addon.json Example{
"id": "your-id.addons.openkuboard.github.io",
"name": "Display Name",
"version": "1.0.0",
"lastUpdate": "2026-06-27",
"maintainer": "your-name",
"isGlobal": true,
"scripts": ["initialize.js"],
"k8s": ["k8s/your-resource.yaml"],
"resources": ["README.md", "extensions.json"],
"info": {
"description": "One-line description of what the addon does.",
"document": "https://..."
},
"parameters": {},
"parameterDefs": [],
"extensions": [],
"quickLinks": [],
"rbac": [],
"installPackages": []
}
See the Addon Spec for the meaning of each field.
Extension points determine which context menu a button appears in. Conventional extension-point IDs all end with extension-point.openkuboard.github.io:
| Extension point | Context |
|---|---|
pod-context.extension-point.openkuboard.github.io |
Pod |
node-context.extension-point.openkuboard.github.io |
Node |
workload-context.extension-point.openkuboard.github.io |
Workload |
namespace-context.extension-point.openkuboard.github.io |
Namespace |
cluster-context.extension-point.openkuboard.github.io |
Cluster |
Each extension contains:
id: unique extension identifierextensionPoint: target extension-point IDbuttonText / buttonTextEn: button labelsbuttonType / buttonIcon: button style and iconhandler: JS executed on click (may use APIs like KuboardProxy, openUrlInBlank)isEnabledFor: decides whether the button is shown for a given contextSee the system-monitor addon’s addon.json and extensions.json for full usage.
<your-id>.addons.openkuboard.github.io/<version>/ at the repo rootaddon.json manifest (use existing addons as reference)k8s/), scripts, extensions, etc.index/repository.json:
{
"id": "your-id.addons.openkuboard.github.io",
"name": "Addon Name",
"version": "1.0.0",
"lastUpdate": "2026-06-27",
"maintainer": "your-name",
"isGlobal": true,
"url": "https://raw.githubusercontent.com/openkuboard/addon/main/your-id.addons.openkuboard.github.io/1.0.0/addon.json",
"info": {
"description": "Description",
"document": "https://github.com/openkuboard/addon/blob/main/your-id.addons.openkuboard.github.io/1.0.0/README.md"
}
}
main branchThis repository is also a GitHub Pages site. To preview locally:
# After installing Ruby and bundler
bundle init 2>/dev/null
echo 'gem "github-pages", group: :jekyll_plugins' >> Gemfile
bundle install
bundle exec jekyll serve
# Open http://127.0.0.1:4000/addon/
Note: the addon data directories (
*.addons.openkuboard.github.io,index/) are excluded in_config.ymlso Jekyll does not render them. Do not remove{{ ... }}Prometheus rule expressions from addon data files — they are required for the addon to work.
version field must matchid field must match the directory name prefix (everything before the version directory)https://raw.githubusercontent.com/openkuboard/addon/main/<id>/<version>/addon.json{{ }}, {% %} in addon data files does not affect the platform (it reads raw files directly) but breaks Jekyll — therefore always keep the _config.yml exclude settings intact.