skip to content

// Plugin development

manifest reference

the full manifest.json schema as a reference.

manifest reference

a .kern file is a zip archive containing manifest.json (required), an optional dist/index.js esm ui bundle, an optional dist/index.css, and any other assets the bundle references.

the manifest declares metadata, a dynamic config form, lifecycle commands, starter files, and ui tabs.

full example

jsonc
{ "id": "web_api", "displayName": "Web API Server", "version": "1.0.0", "author": "ellipog", "description": "Run a Node.js/Express web API with env-based config, health checks, and pm2 or nodemon for hot reload.", "uiEntry": "dist/index.js", "configSchema": [ { "key": "port", "label": "Port", "type": "text", "default": "3000" }, { "key": "log_level", "label": "Log Level", "type": "select", "options": ["debug","info","warn","error"], "default": "info" } ], "lifecycle": { "start": { "command": "node", "args": ["{{userOverrides.entry}}"] }, "start.nodemon": { "command": "nodemon", "args": ["{{userOverrides.entry}}"], "useShell": true } }, "scaffold": { "env": { "path": ".env", "content": "PORT={{userOverrides.port}}\nLOG_LEVEL={{userOverrides.log_level}}\n" }, "readme": { "path": "README.md", "content": "Web API ({{userOverrides.port}})…" } }, "tabs": [ { "id": "setup", "label": "Setup" }, { "id": "logs", "label": "Logs" } ] }

field reference

fieldtyperequirednotes
idstringyesunique, lowercase, underscores. the registry key.
displayNamestringyeshuman name.
versionstringyessemver.
authorstringyesa github handle. the official plugins are published by ellipog.
descriptionstringyesone-liner for cards/detail.
uiEntrypathnodist/index.js — the esm bundle exposing mount(hostApi).
configSchemafield[]nothe dynamic config form (see config-schema).
lifecycleobjectnonamed lifecycle steps (see lifecycle).
scaffoldobjectnostarter files written into a fresh instance (see scaffold).
tabstab[]nodeclarative tabs the plugin registers in the detail view.

// warn

id must be lowercase with underscores only. web_api is valid; Web-API is not.