Skip to main content

plugin.json

The complete reference for plugin.json, the manifest in every plugin folder. For an explanation with examples, see The manifest. The file is JSON; comments (// and /* */) and trailing commas are allowed, and property names are case sensitive.

Fields​

FieldTypeRequiredDefaultDescription
idstringyesUnique, stable id: lowercase letters and digits in groups separated by ., - or _, such as coral-cove.spinners.
namestringnothe idName shown in the editor.
versionstringno1.0.0The plugin's version, major[.minor[.patch]]; missing parts are 0.
descriptionstringnoemptyOne or two sentences shown on the plugin's card.
authorslist of stringsnoemptyShown on the plugin's card.
licensestringnoIdeally an SPDX expression, such as MIT.
homepagestringnoAn absolute http or https address. The card links to it.
iconstringnoAn image file inside the plugin folder, such as icon.png, shown on the card.
assemblystringyesFile name of the runtime assembly, a .dll directly in the plugin folder.
editorAssemblystringnoFile name of the editor assembly, a different .dll directly in the plugin folder. Only the editor loads it.
contractVersionintegeryesThe engine contract version the plugin was built against, 1 or more. Must equal the engine's (1) or the plugin is skipped.
minEngineVersionstringnoanyThe oldest engine version the plugin runs on, such as 0.1.0.
dependencieslist of objectsnoemptyOther plugins this plugin uses; see below.
permissionslist of stringsnoemptyPermission names; see Permissions.
extensionslist of stringsnoemptyExtension point ids the plugin contributes to, shown on its card; see Extension ids.
assetsstringnoA folder inside the plugin folder with files the plugin ships.
enabledbooleannotruefalse installs the plugin switched off until a game's plugins.json lists it under enabled.

Paths in icon and assets are relative to the plugin folder, use / or \, and may not contain .., a drive or a root.

Dependency objects​

FieldTypeRequiredDefaultDescription
idstringyesThe dependency's plugin id.
versionstringno*A version range the installed version must satisfy.
optionalbooleannofalseWhether the plugin also loads without the dependency.
minimumVersionstringnoOlder form of "version": ">=…"; not together with version.

Permission names​

fileSystem, network, processExecution, editorUi, runtimeScene, assetWrite, renderBackend. See Permissions for what each means and what is checked.

Extension ids​

The well-known ids, with the name the editor shows for them. Other ids in the same format are allowed, such as an extension point of another plugin.

IdShown as
systemsSystems
componentsComponents
scriptsScript types
scenesScenes
scene.listenersScene lifecycle hooks
servicesServices
importersAsset importers
overlaysGame overlays
particles.modulesParticle modules
lightingLighting features
render.passesRender passes
editor.panelsEditor panels
editor.commandsEditor commands
editor.menusMenu entries
editor.toolbarToolbar items
editor.inspectorsInspector property editors
editor.toolsViewport tools
tile.toolsTile map tools

The constants are in PluginExtensionPoints. The list is informational: it does not change what the plugin can register.

Version range syntax​

RangeAccepts
1.2.3, =1.2.3exactly 1.2.3
1.2, 1.2.x, 1.2.*1.2.0 up to, not including, 1.3.0
>1.2.3, >=1.2, <2.0, <=1.2comparisons; a partial version stands for all its versions, so <=1.2 is below 1.3.0 and >1.2 from 1.3.0
^1.2.31.2.3 up to 2.0.0; for 0.x, up to the next minor (^0.2.3 is below 0.3.0) and for 0.0.x only that patch
~1.2.3, ~1.21.2.3 (or 1.2.0) up to 1.3.0
>=1.2 <2.0space-separated comparisons must all hold
1.0 || ^3.0either side of ||
*, xany version

More examples and their results are in Dependencies and versions.

Examples​

A minimal manifest:

plugin.json
{
"id": "acme.weather",
"assembly": "Weather.dll",
"contractVersion": 1
}

The manifest of the cutscene sample:

samples/Talesmith.Samples.Cutscenes/plugin.json
{
"id": "samples.cutscenes",
"name": "Cutscenes and dialogue",
"version": "1.0.0",
"description": "Plays scripted cutscenes with camera moves and dialogue choices when the player enters a map trigger with a 'cutscene' property.",
"authors": [ "Talesmith" ],
"assembly": "Talesmith.Samples.Cutscenes.dll",
"contractVersion": 1,
"minEngineVersion": "0.1.0",
"permissions": [ "runtimeScene" ],
"extensions": [ "importers", "systems", "scene.listeners", "overlays", "services" ]
}

A manifest with every field:

plugin.json
{
"id": "coral-cove.spinners",
"name": "Spinners",
"version": "1.2.0",
"description": "Turns entities with a Spinner component, with editor tools to place and tune them.",
"authors": [ "Dylan de Beer" ],
"license": "MIT",
"homepage": "https://example.com/spinners",
"icon": "icon.png",
"assembly": "Spinners.dll",
"editorAssembly": "Spinners.Editor.dll",
"contractVersion": 1,
"minEngineVersion": "0.1.0",
"dependencies": [
{ "id": "samples.hexquest", "version": "^1.0", "optional": true }
],
"permissions": [ "runtimeScene", "editorUi" ],
"extensions": [ "components", "systems", "editor.panels", "editor.commands", "editor.tools" ],
"assets": "assets",
"enabled": true
}

Validation errors​

A manifest with errors makes the plugin Failed; the reason starts with the file's path and is invalid:, then lists every problem. Messages, with x standing for the value found:

FieldMessage
the fileis not valid JSON: … (the parser's message)
the filethe file must contain a JSON object.
anyunknown property "x"; did you mean "y"? or unknown property "x" (expected one of: …).
any stringx must be a string.
idid is required., id must not be empty.
idid "x" must be lowercase letters and digits separated by '.', '-' or '_', such as "talesmith.cutscenes".
version, minEngineVersionversion "x" must be a version such as "1.2.0".
authorsauthors must be a list of names, such as ["Ada Lovelace"].
homepagehomepage "x" must be an http or https address, such as "https://example.com/my-plugin".
iconicon "x" must be an image file inside the plugin folder, such as "icon.png", without ".." or a drive or root.
assetsassets "x" must be a folder inside the plugin folder, such as "assets", without ".." or a drive or root.
assembly, editorAssemblyassembly is required., assembly "x" must be the file name of a .dll in the plugin folder, such as "MyPlugin.dll".
editorAssemblyeditorAssembly must be a separate assembly from assembly, so games never load editor code.
contractVersioncontractVersion is required (this engine uses 1)., contractVersion must be a whole number such as 1.
dependenciesdependencies must be a list such as [{ "id": "talesmith.dialogue", "version": "^1.0" }].
dependenciesdependencies[0] must be an object with an id, an optional version range and an optional "optional" flag.
dependenciesdependencies[0] id is required., dependencies[0] id "x" is not a valid plugin id., a plugin cannot depend on itself.
dependenciesdependencies[0] version: … followed by a range error below
dependenciesdependencies[0] has both version and minimumVersion; use only version, such as ">=1.0.0".
dependenciesdependencies[0] minimumVersion "x" must be a version such as "1.0.0"., dependencies[0] optional must be true or false.
dependenciesdependency "x" is listed more than once.
permissionspermissions must be a list of permission names (fileSystem, network, …).
permissionspermission "x" is unknown; did you mean "y"?, permission "x" is listed more than once.
extensionsextensions must be a list of extension point ids, such as ["systems", "editor.panels"].
extensionsextension "x" must be lowercase letters and digits separated by '.', '-' or '_', such as "editor.panels"., extension "x" is listed more than once.
enabledenabled must be true or false.

Range errors:

MessageCause
a version range must not be empty; use "*" for any version."version": ""
"1.0 ||" has an empty alternative around "||".nothing on one side of ||
"-" in "1.0 - 2.0" is not a version or comparison; use forms such as "1.2.0", "^1.2", "~1.2", ">=1.2 <2.0" or "*".a part that is not a version or comparison, including pre-release tags

These do not invalidate the manifest but are shown as warnings on the plugin:

WarningCause
it ships an editor assembly (X.dll) but does not declare the "editorUi" permission.editorAssembly without editorUi
its assets folder "x" does not exist.assets names a missing folder
its icon "x" does not exist.icon names a missing file
its editor assembly X.dll was not found, so its editor features are unavailable.editorAssembly names a missing file (editor only)