# `plugin.json` manifest reference Every plugin lives in `plugins//` and must declare a `plugin.json` manifest. JSON Schema for this format ships at [`schema/plugin.schema.json`](../schema/plugin.schema.json) and is enforced in CI for in-tree plugins. ## Full example ```json { "id": "my_plugin", "name": "My Plugin", "version": "1.0.0", "private": false, "standards": ["capability-pipelines.v1", "plugin-runtime-idempotent.v1"], "type": "visualization", "nav": { "label": "My Plugin", "screen": "plugin-my_plugin" }, "screen": "screen.html", "script": "screen.js", "styles": "assets/plugin.css", "routes": "routes.py", "settings": { "html": "settings.html", "server_files": ["my_plugin.db", "my_plugin_models/"] }, "diagnostics": { "server_files": ["my_plugin.diag.json"], "callable": "diagnostics:collect" }, "settings_schema": { "schema_version": "1", "packable_keys": ["enabled"] }, "ui": { "settings": [{ "id": "my-plugin-settings", "region": "plugin-settings", "label": "My Plugin" }] }, "capabilities": { "library": { "roles": ["provider"], "operations": ["query-page", "query-artists", "query-stats"], "mode": "active", "compatibility": "none", "ownership": "multi-provider", "safety": "safe", "version": 1 } } } ``` All fields except `id` and `name` are optional. Plugins can have any combination of frontend (screen/script), backend (routes), and settings. ## Fields ### `id` (required, string) Snake-case identifier. Used to namespace `localStorage` keys, build the plugin's screen id (`plugin-`), namespace the backend logger (`slopsmith.plugin.`), and as the directory name in diagnostics bundles. Cannot contain slashes, dots are encoded by the sibling-import loader (see [plugin-sibling-imports.md](plugin-sibling-imports.md)). ### `name` (required, string) Human-readable name shown in UI surfaces. ### `version` (string, optional) Plain semver string. Advisory only — the plugin loader does not consume this. Plugins commonly include it for publishing/tooling purposes. ### `private` (boolean, optional) Advisory metadata for plugin authors. Not consumed by the loader. ### `standards` (string[], optional) Versioned contracts the plugin participates in. New capability-aware plugins should declare `"capability-pipelines.v1"` when they include native `capabilities`, `ui`, `runtime_domains`, or related metadata. Declare `"plugin-runtime-idempotent.v1"` only when repeated script hydration cannot duplicate wrappers, listeners, timers, DOM roots, diagnostics contributors, jobs, media nodes, or capability participants. ### `capability_api` (object, optional) Explicit capability API marker. Most plugins can use the compact `standards` form instead: ```json { "capability_api": { "standard": "capability-pipelines.v1", "version": 1 } } ``` ### `type` (string, optional — role hint, slopsmith#36) Supported values: - `"visualization"` — plugin provides a highway renderer. Declaring this makes the plugin eligible for the main-player viz picker AND splitscreen's per-panel picker. Must pair with a `window.slopsmithViz_` factory exporting the setRenderer contract (see [plugin-visualization-contracts.md](plugin-visualization-contracts.md)). - Absent → no declared role; plugin is loaded and its script runs, but it doesn't appear in role-specific UIs. ### `nav` (object, optional) `{ "label": string, "screen": string }` — adds a navbar entry that calls `showScreen()`. `screen` is typically `plugin-`. ### `screen` (string, optional) Path to HTML file (relative to plugin dir). Mounted at `#plugin-` in the SPA. ### `script` (string, optional) Path to JS file (relative to plugin dir). Loaded via `