Skip to main content

Plugin Manifest

Every plugin requires a manifest.json file that describes the plugin and its modules.

Basic structure

{
"id": "my-plugin",
"name": "My Plugin",
"modules": [
{
"id": "my-panel",
"name": "My Panel",
"main": "index.html",
"type": "panel"
}
]
}

Top-level fields

FieldTypeRequiredDescription
idstringYesUnique plugin identifier. Use lowercase with hyphens.
namestringYesHuman-readable name displayed in the UI.
modulesarrayYesArray of module definitions.

Module fields

FieldTypeRequiredDescription
idstringYesUnique module identifier within the plugin.
namestringYesHuman-readable name for the module.
mainstringYesEntry point file (usually index.html).
typestringYesModule type: panel, editor, service, or blank.
permissionsarrayNoList of permissions the module requires.
ordernumberNoSort order for panels (lower = higher in sidebar).
fileAssociationsarrayNoFile extensions this editor handles (for editor type).

Module types

Panel

Displays in the left sidebar. Use for navigation, file explorers, or tool interfaces.

{
"id": "file-browser",
"name": "Files",
"main": "index.html",
"type": "panel",
"order": 0
}

Editor

Opens files of specific types. Appears in the main content area.

{
"id": "markdown-editor",
"name": "Markdown Editor",
"main": "index.html",
"type": "editor",
"fileAssociations": [".md", ".markdown"]
}

Service

Runs in the background without UI. Use for background processing or maintaining state.

{
"id": "sync-service",
"name": "Sync Service",
"main": "service.html",
"type": "service"
}

Blank

Minimal module that loads but has no designated UI slot. Useful for registering LLM tools without needing a visible panel.

{
"id": "tools-only",
"name": "AI Tools",
"main": "index.html",
"type": "blank"
}

Permissions

Declare permissions your plugin needs:

{
"id": "my-panel",
"name": "My Panel",
"main": "index.html",
"type": "panel",
"permissions": ["fs.watch", "ui:read"]
}

Available permissions

PermissionDescription
fs.watchSubscribe to file system change events
ui:readRead UI state (open tabs, etc.)
note

Most SDK methods work without explicit permissions. Permissions are only required for specific features like file watching.

Multiple modules

A single plugin can contain multiple modules:

{
"id": "my-plugin",
"name": "My Plugin",
"modules": [
{
"id": "sidebar-panel",
"name": "My Panel",
"main": "panel.html",
"type": "panel"
},
{
"id": "md-editor",
"name": "Markdown Editor",
"main": "editor.html",
"type": "editor",
"fileAssociations": [".md"]
},
{
"id": "background",
"name": "Background Service",
"main": "service.html",
"type": "service"
}
]
}

File associations

For editor modules, specify which file extensions to handle:

{
"id": "image-viewer",
"name": "Image Viewer",
"main": "index.html",
"type": "editor",
"fileAssociations": [".png", ".jpg", ".jpeg", ".gif", ".webp"]
}

When a user opens a file with a matching extension, your editor will be used.