Manifest Reference
Complete reference for every field in a plugin's manifest.json file.
Every plugin requires a manifest.json file in its root directory. This file describes the plugin to the host and controls how it's loaded and displayed.
New to plugins? Start with the Getting Started tutorial first.
Complete Example
{
"name": "project-stats",
"displayName": "Project Stats",
"version": "2.0.0",
"description": "Scans the current project and shows file counts, lines of code, and file-type breakdown.",
"author": "Claude Code UI",
"icon": "BarChart3",
"type": "module",
"slot": "tab",
"entry": "index.js",
"server": "server.js",
"permissions": []
}Required Fields
name
| Type | string |
| Required | Yes |
| Validation | Must match /^[a-zA-Z0-9_-]+$/ |
The unique identifier for your plugin. Used internally for configuration, routing, and directory naming. Must only contain letters, numbers, hyphens, and underscores.
"name": "my-awesome-plugin"Tip: Use kebab-case for consistency. This name appears in API routes (
/api/plugins/my-awesome-plugin/...).
displayName
| Type | string |
| Required | Yes |
The human-readable name shown in the tab bar and Settings panel. Can contain any characters including spaces and emoji.
"displayName": "Project Stats"entry
| Type | string |
| Required | Yes |
Path to the frontend entry file, relative to the plugin's root directory. This must be a JavaScript file that exports mount() and optionally unmount() functions. See the Frontend API Reference for details.
"entry": "index.js"Optional Fields
version
| Type | string |
| Default | "0.0.0" |
Semantic version string. Displayed in the plugin card in Settings. Purely informational.
"version": "1.2.3"description
| Type | string |
| Default | "" |
Short description shown below the plugin name in Settings. Keep it under 120 characters.
"description": "Shows file counts, lines of code, and file-type breakdown for your project."author
| Type | string |
| Default | "" |
Plugin author name. Displayed in the plugin card.
"author": "Jane Developer"icon
| Type | string |
| Default | "Puzzle" |
The icon displayed in the tab bar. Can be one of the built-in icon names or a path to a custom SVG file in your plugin directory.
Built-in icon names (from Lucide Icons):
| Icon Name | Description |
|---|---|
Puzzle | Puzzle piece (default) |
Box | Package/box |
Database | Database cylinder |
Globe | Web/globe |
Terminal | Terminal/console |
Wrench | Settings/tools |
Zap | Lightning bolt |
BarChart3 | Bar chart |
Folder | File folder |
MessageSquare | Chat/message |
GitBranch | Git branch |
Custom icon file:
"icon": "icon.svg"type
| Type | string |
| Default | "module" |
Set this to "module". Your entry file is loaded as an ES module that exports mount(container, api) and optionally unmount(container).
"type": "module"slot
| Type | "tab" |
| Default | "tab" |
Where the plugin appears in the UI. Currently only tab is supported.
"slot": "tab"server
| Type | string | null |
| Default | null |
Path to a Node.js server entry file, relative to the plugin directory. When set, the host spawns this as a managed subprocess and proxies RPC calls to it. See Backend Servers for the full guide.
"server": "server.js"Omit this field for frontend-only plugins.
permissions
| Type | string[] |
| Default | [] |
Reserved for future use. Will be used for declaring capabilities the plugin requires (filesystem access, network access, etc.). For now, set to an empty array or omit entirely.
"permissions": []Validation Rules
The host validates your manifest on installation and every time plugins are scanned. Invalid manifests cause the plugin to be skipped with a warning.
| Rule | Error |
|---|---|
| Must be a valid JSON object | Invalid manifest: not a JSON object |
name must be present and a string | Missing required field: name |
displayName must be present and a string | Missing required field: displayName |
entry must be present and a string | Missing required field: entry |
name must match /^[a-zA-Z0-9_-]+$/ | Invalid plugin name: must only contain... |
Minimal Manifest
The smallest valid manifest:
{
"name": "my-plugin",
"displayName": "My Plugin",
"entry": "index.js"
}Next Steps
- Frontend API Reference — What your
mount()function receives - Backend Servers — Adding a server subprocess
- Example: Project Stats — See a real manifest in action