Every plugin has a manifest.json file at the root of its install folder. Projelli reads this file on install and on every load. If validation fails, the plugin won't load and the error appears in the Plugins panel.
{
"id": "word-counter",
"name": "Word Counter",
"version": "1.0.0",
"apiVersion": "1.0.0",
"author": {
"name": "Projelli Examples",
"url": "https://projelli.com"
},
"description": "Live word and character count for the active document.",
"main": "dist/index.js",
"permissions": ["editor:selection"],
"minProjelliVersion": "2.0.0",
"category": "writing",
"tags": ["editor", "writing", "stats"],
"license": "MIT"
}
Unique identifier for your plugin. Lowercase, alphanumeric, with hyphens. No spaces. The folder name on disk must match this id.
"id": "word-counter"
Human-readable display name. Shown in the Plugins panel and the marketplace.
"name": "Word Counter"
Your plugin's version, in semver format (major.minor.patch). Bump this every time you ship a new build.
"version": "1.2.3"
Which version of the Projelli plugin API your plugin targets. Currently 1.0.0. Projelli will refuse to load plugins whose apiVersion is incompatible with the host.
"apiVersion": "1.0.0"
Who built this plugin. name is required. githubUser and url are optional.
"author": {
"name": "Jane Doe",
"githubUser": "janedoe",
"url": "https://janedoe.dev"
}
One sentence describing what the plugin does. Shown in the marketplace card and the Installed list. Keep it under 140 characters.
"description": "Live word and character count for the active document."
Path inside your plugin folder to the JS entry file. Must be a built ES module that export defaults an object with an activate function. The scaffolder sets this to dist/index.js.
"main": "dist/index.js"
Array of permission strings your plugin needs. Empty array if you don't need any. The user is prompted to approve these on install. See the permissions guide for the full list.
"permissions": ["editor:selection", "ai:invoke"]
Minimum version of Projelli your plugin requires. If the user's Projelli is older, the plugin won't load.
"minProjelliVersion": "2.0.0"
One of: writing, productivity, research, ai, integration, theme, utility, other. Used to group plugins in the marketplace.
"category": "writing"
Lowercase keywords that help users find your plugin in marketplace search. 3 to 8 tags is typical.
"tags": ["editor", "writing", "stats"]
Maximum Projelli version your plugin works with. Leave unset unless you know your plugin won't survive a future major version. If the user's Projelli is newer than this, the plugin won't load.
"maxProjelliVersion": "2.99.99"
Array of relative paths to screenshot images. Used in the marketplace listing. PNG or JPG, 1280x800 recommended.
"screenshots": ["screenshots/main.png", "screenshots/settings.png"]
URL of the plugin's homepage or GitHub repo. Linked from the marketplace listing.
"homepage": "https://github.com/janedoe/projelli-word-counter"
SPDX license identifier. The scaffolder sets MIT. Marketplace requires an open-source license; MIT, Apache-2.0, and BSD-3-Clause are common choices.
"license": "MIT"
The on-disk manifest is validated with Zod on install and again on every load. If a required field is missing, the wrong type, or fails a format check (semver, lowercase id), the plugin is marked as failed and the validation error is shown in the Plugins panel.
You can preflight your manifest by building your plugin and dropping it in the local plugins folder; the Plugins panel will show any validation errors immediately.
Next: Permissions →