Manifest reference
Every field of an Athanor plugin's manifest.json in API version 1: types, limits and examples, the permissions list, contributes and network rules.
What the manifest is
manifest.json declares everything a plugin is and adds, so Athanor knows what it does before running a line of its code. The permission sheet and the directory listing are built from it.
Athanor reads it strictly: fields it does not know are dropped, every string is trimmed and cut to its limit, and a manifest it cannot accept is refused with sentences that say what to fix. You see them when you import a folder or publish.
A complete example
{
"id": "yourname.heavy-structures",
"name": "Heavy structures",
"version": "1.2.0",
"api": "1.0.0",
"author": "Your Name",
"description": "Flags structures over a weight you choose, and numbers the structures on the page.",
"main": "main.js",
"ui": "ui.html",
"permissions": ["document.read", "document.edit"],
"network": { "allowedDomains": [] },
"contributes": {
"commands": [{ "key": "number-all", "title": "Number every structure" }],
"panels": [{ "key": "main", "title": "Heavy structures", "icon": "flask", "defaultDock": "right" }],
"formats": [{ "key": "smiles-list", "label": "SMILES list", "extensions": ["txt"], "mime": "text/plain", "export": true }],
"checks": [{ "key": "heavy", "title": "Heavy structures", "runOn": "change" }],
"inputSources": [{ "key": "solvents", "title": "Common solvents", "kind": "search" }]
},
"settings": [
{ "key": "limit", "type": "number", "label": "Flag structures heavier than (g/mol)", "default": 500, "min": 100, "max": 2000 }
]
}Top-level fields
| Field | Required | Type | Limits and rules | Example |
|---|---|---|---|---|
id |
Yes | string | Lowercase, at most 80 characters, shaped author.plugin-name: two or more parts of letters, digits and dashes, joined by dots. To publish, the first part (before the first dot) must be letters and digits only. Stable for the plugin's life; another account cannot publish the same id |
"yourname.heavy-structures" |
name |
Yes | string | At most 60 characters | "Heavy structures" |
version |
Yes | string | Semantic version, MAJOR.MINOR.PATCH. Development builds may add a pre-release tag (1.0.0-beta.1); publishing accepts plain 1.2.0 only. Every published version must be new |
"1.2.0" |
api |
Yes | string | The API version the plugin is written for. The major number must be 1 |
"1.0.0" |
author |
Yes | string | At most 60 characters | "Your Name" |
description |
No | string | At most 400 characters | |
main |
Yes | string | The logic file's name, at most 200 characters | "main.js" |
ui |
With panels | string | The window file's name, at most 200 characters. Required when the plugin declares panels | "ui.html" |
minAppVersion |
No | string | At most 20 characters. Stored; API 1 does not check it yet | "0.3.31" |
permissions |
No | string array | Only names from the list below; duplicates are dropped; an unknown name refuses the manifest | ["document.read"] |
network |
With network |
object | allowedDomains and reasoning, below |
|
contributes |
No | object | What the plugin adds, below | |
settings |
No | array | Up to 30 fields, below |
The Publish window also writes an icon field into the manifest it uploads, from the icon you pick there. You do not need to write it yourself.
Permissions
API 1 has exactly five. A plugin gets only those it declares, and the person can switch off any of them after installing.
| Permission | On the permission sheet | Lets the plugin |
|---|---|---|
document.read |
Read the open document: see the structures, text and names in the file you are working on | Call athanor.snapshot() and athanor.conformer(), receive documentchange. Required for exporters and checks |
document.edit |
Edit the document: propose and make changes. You can undo every change, and Athanor checks each one first | Call athanor.apply() and athanor.propose() |
network |
Access the internet: only the sites in allowedDomains |
Make requests from ui.html to those sites |
files.save |
Save files: offer files for you to save (you choose where) | Declared and shown; API 1 has no call that uses it. An exporter does not need it |
user.identity |
Know who you are: your display name and avatar, never your email or password | Declared and shown; API 1 has no call that uses it |
A plugin with no permissions shows "This plugin needs no special access." A plugin with both network and document.read adds "It could send your document's contents to those sites."
network
| Field | Type | Rules |
|---|---|---|
allowedDomains |
string array | Up to 20 host names, lowercased, optionally with a path (example.org/v1). *.example.org allows its subdomains and * allows any site; publishing refuses both. Required (at least one) with the network permission; ignored, with a warning, without it |
reasoning |
string | At most 300 characters. Required when allowedDomains contains *. Shown on the permission sheet after "Why:" |
See Network access.
contributes
Each list holds up to 50 entries. Every entry has a key: lowercase letters, digits, dots, dashes and underscores, starting with a letter or digit, at most 64 characters, unique within its list. (id is accepted in place of key.)
commands
| Field | Required | Rules |
|---|---|---|
key |
Yes | As above |
title |
Yes | At most 60 characters. What the menus and Ctrl+K show |
menu |
No | Up to 3 names of at most 40 characters. Stored, and used as search words; API 1 does not build submenus from it |
parameters |
No | Up to 10 { "key", "name", "optional" } (key up to 40, name up to 60 characters). Stored; API 1 has no control that fills them |
panels
| Field | Required | Rules |
|---|---|---|
key |
Yes | As above |
title |
Yes | At most 40 characters |
icon |
No | An icon name from Athanor's set, at most 40 characters. Defaults to a plug |
defaultDock |
No | "right" (default), "left" or "float". Stored; API 1 does not place the panel by it |
A manifest with panels must have ui.
formats
| Field | Required | Rules |
|---|---|---|
key |
Yes | As above. The handler is registered with this key |
label |
Yes | At most 40 characters |
extensions |
Yes | 1 to 5, without the dot, letters and digits, up to 10 characters each |
mime |
No | At most 100 characters. Defaults to application/octet-stream |
export |
One of these | true to appear in the Export window |
import |
One of these | true is accepted; API 1 does not run importers |
notes |
No | At most 200 characters. The tooltip in the Export window |
An exporter needs document.read.
checks
| Field | Required | Rules |
|---|---|---|
key |
Yes | As above |
title |
Yes | At most 60 characters |
runOn |
No | "change" (default) runs after each edit. "demand" is accepted, but API 1 never runs it |
Checks need document.read.
inputSources
| Field | Required | Rules |
|---|---|---|
key |
Yes | As above |
title |
Yes | At most 40 characters. Shown beside each candidate in Quick insert |
icon |
No | At most 40 characters |
kind |
No | "search" (default). "stream" is accepted and reserved |
settings
| Field | Required | Rules |
|---|---|---|
key |
Yes | At most 40 characters |
label |
Yes | At most 80 characters |
type |
Yes | boolean, number, string or select. Any other type refuses the manifest |
default |
No | Of the field's type. A string default is cut at 200 characters; a select default must be one of options |
min, max |
No | Numbers only. The value is held between them |
options |
With select |
1 to 20 strings of at most 60 characters |
See Settings.
Messages you may see
| Message | Fix |
|---|---|
"id" must look like author.plugin-name (lowercase letters, digits, dots and dashes). |
Use two or more dot-separated parts |
This plugin is written for API 2.0.0; this Athanor runs API 1. |
Set "api": "1.0.0" |
Unknown permission "…". API 1 has: document.read, document.edit, network, files.save, user.identity. |
Use only the five names |
The "network" permission needs network.allowedDomains. |
List the sites |
Access to every domain ("*") needs network.reasoning. |
Add reasoning, or name the sites |
Panels need a "ui" file (ui.html). |
Add "ui": "ui.html" |
Exporters and checks read the document: add the "document.read" permission. |
Add it |
Format "…" must import, export, or both. |
Add "export": true |
Two commands share the key "…". |
Make keys unique |
Is this helpful?
Last updated Nov 11, 2026
- Still stuck? Read the FAQ or contact support.
- Something wrong on this page? Tell us.
- For AI tools: llms.txt
