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