Manifest

Directory structure

.moss/plugins/my-plugin/
├── manifest.json      Plugin metadata and config
├── main.bundle.js     Built JavaScript entry point
├── config.json        Runtime config (overrides defaults)
└── icon.svg           Plugin icon (optional)

Plugins live in .moss/plugins// inside each project.

Required fields

FieldTypeDescription
namestringPlugin identifier (used as folder name)
versionsemverPlugin version
descriptionstringShort description
authorstringAuthor name
entrystringJavaScript bundle filename
capabilitiesstring[]Hook types: "process", "generate", "enhance", "deploy", "syndicate"
global_namestringJavaScript global object name (e.g., "MyPlugin")

Optional fields

FieldTypeDescription
domainstringPrimary service domain (e.g., "matters.town")
iconstringIcon filename (falls back to icon.svg, icon.png, logo.svg, logo.png)
display_namestringDisplay name in settings UI

Example manifest

{
  "name": "my-deploy",
  "version": "1.0.0",
  "description": "Deploy to My Hosting",
  "author": "Your Name",
  "entry": "main.bundle.js",
  "capabilities": ["deploy"],
  "global_name": "MyDeployPlugin",
  "domain": "myhost.example",
  "icon": "icon.svg",
  "config": {
    "auto_deploy": false,
    "region": "us-east"
  },
  "config_schema": {
    "auto_deploy": "boolean",
    "region": "string"
  },
  "config_labels": {
    "auto_deploy": "Auto Deploy",
    "region": "Server Region"
  },
  "config_descriptions": {
    "auto_deploy": "Automatically deploy after each build",
    "region": "Hosting region for your site"
  }
}

Configuration

Defaults and schema

config sets default values. config_schema declares the type of each field ("boolean", "number", "string"). moss generates a settings UI from these automatically.

Manifest fieldPurpose
configDefault values
config_schemaField types for UI generation
config_labelsDisplay labels in settings
config_descriptionsHelp text in settings
config_placeholdersPlaceholder text for inputs

Config resolution

Plugin configuration is resolved in priority order:

  1. .moss/plugins//config.json — highest priority
  2. .moss/plugins//config.toml
  3. .moss/config.toml [plugins.] section — lowest

Config verification

config_verify probes an endpoint after the user saves config:

"config_verify": {
  "api_key": {
    "probe": "https://api.example.com/verify/{value}",
    "expect": "ok"
  }
}

is replaced with the user's input. The probe runs and checks the response.

Schema contributions

Plugins can add frontmatter fields via contributes.frontmatter.fields:

"contributes": {
  "frontmatter": {
    "fields": {
      "syndicated_url": {
        "type": "string",
        "description": "URL where this article was syndicated"
      }
    }
  }
}

Contributed fields are merged into the active schema at runtime and appear in the editor.

moss-api SDK

The moss-api package provides types and utilities for plugin development.

npm install moss-api

Types

ExportDescription
DeployContextPassed to deploy hooks
SyndicateContextPassed to syndicate hooks
EnhanceContextPassed to enhance hooks
HookResultReturn type for all hooks
PluginManifestManifest shape

Utilities

ExportDescription
reportProgressShow progress message in the UI
reportErrorReport a non-fatal error
log / warn / errorStructured logging

Browser

ExportDescription
openBrowserOpen a URL in the system browser
closeBrowserClose a previously opened browser tab

Building

Bundle with esbuild as an IIFE:

esbuild src/main.ts --bundle --format=iife --global-name=MyPlugin --outfile=dist/main.bundle.js

Testing

Use vitest with the mock Tauri setup from moss-api:

import { describe, it, expect } from 'vitest';

describe('deploy', () => {
  it('returns success', async () => {
    const result = await MyPlugin.deploy(mockContext);
    expect(result.success).toBe(true);
  });
});
npx vitest run
Published with moss