// 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
| field | type | required | notes |
|---|---|---|---|
id | string | yes | unique, lowercase, underscores. the registry key. |
displayName | string | yes | human name. |
version | string | yes | semver. |
author | string | yes | a github handle. the official plugins are published by ellipog. |
description | string | yes | one-liner for cards/detail. |
uiEntry | path | no | dist/index.js — the esm bundle exposing mount(hostApi). |
configSchema | field[] | no | the dynamic config form (see config-schema). |
lifecycle | object | no | named lifecycle steps (see lifecycle). |
scaffold | object | no | starter files written into a fresh instance (see scaffold). |
tabs | tab[] | no | declarative tabs the plugin registers in the detail view. |
// warn
id must be lowercase with underscores only. web_api is valid; Web-API is not.