Skip to content

Plugin Requirements ​

When publishing your plugin, ensure it meets these requirements:

General Requirements ​

  1. Repository naming - Repository name must be prefixed with aloha-
  2. Open source - Plugin must be open source. Don't obfuscate code to hide its purpose.
  3. No code eval - Don't execute the code loaded over the internet. All executable code needs to be contained in your plugin.
  4. Privacy - No telemetry - respect users' privacy
  5. Manifest - Must include a valid manifest.json file
  6. Release - Must be published as a GitHub release
  7. No auto-update - Don't include a mechanism that updates the plugin by itself. Let users manage updates in the app.
  8. No dynamic adds - Don't insert dynamic ads that are loaded over the internet

Violations can be reported here.

Icon Requirements ​

Maximum Size ​

10kB maximum file size

Supported Formats ​

  • image/svg+xml (recommended)
  • image/png
  • image/jpeg / image/jpg
  • image/gif
  • image/webp
  • image/ico / image/x-icon
  • image/bmp
  • image/tiff

Best Practices ​

Use monochrome icons with #171717 color and transparent background. Colors will be inverted automatically for dark mode.

Recommended source: Use SVG icons from Lucide for consistent, professional-looking icons that match the Aloha Desktop design language.

Manifest Requirements ​

Your manifest.json must include at least the following minimal manifest below. You can copy that as a template and customize.

json
{
  "manifestVersion": 1,
  "name": "Your Plugin Name",
  "version": "1.0.0",
  "description": "Short description of your plugin",
  "author": "Your Name",
  "main": "src/index.esm.js",
  "tools": [
    {
      "name": "toolName",
      "displayName": "Tool Display Name",
      "description": "What this tool does, when and how to use it"
    }
  ]
}

Manifest Fields ​

FieldTypeRequiredDescription
manifestVersionnumber✅Currently always 1
namestring✅Display name of your plugin
versionstring✅Semantic version (e.g., "1.0.0")
descriptionstring✅Displayed under your plugin name
authorstring✅Your name
iconstringPath to icon file relative to plugin root
mainstring✅Path to main entry point file
toolsarray✅Array of tool definitions

Tool Definition ​

Each tool in the tools array must include:

FieldTypeRequiredDescription
namestring✅Unique tool identifier (used in code)
displayNamestring✅Human-readable tool name displayed in the conversation history
descriptionstring✅What the tool does (used by AI to decide when to use it)
parametersobjectSchema defining tool parameters

Tool Parameter Definition ​

The parameters object follows JSON Schema specification. Common fields:

FieldTypeRequiredDescription
typestring✅Currently always "object"
requiredstring[]Array of required property names
propertiesobject✅Defines object properties
properties.<name>.descriptionstring✅Parameter description (helps AI understand usage)
properties.<name>.enumarrayList of allowed values
properties.<name>.itemsobjectSchema for array items (for type "array")

Example with multiple parameter types:

json
{
  "name": "search",
  "displayName": "Search",
  "description": "Search for items",
  "parameters": {
    "type": "object",
    "required": ["query"],
    "properties": {
      "query": {
        "type": "string",
        "description": "Search query",
        "minLength": 1
      },
      "limit": {
        "type": "number",
        "description": "Maximum results",
        "minimum": 1,
        "maximum": 100,
        "default": 10
      },
      "category": {
        "type": "string",
        "description": "Filter by category",
        "enum": ["all", "docs", "code", "images"]
      },
      "includeArchived": {
        "type": "boolean",
        "description": "Include archived items",
        "default": false
      }
    }
  }
}

More JSON Schema Examples

Code Requirements ​

Export Structure ​

Your main file must default export a class:

typescript
import { Plugin } from 'aloha-sdk'
import type { PluginContext } from 'aloha-sdk'

export default class MyPlugin extends Plugin {
  constructor(context: PluginContext) {
    super(context)
  }

  async toolCall(toolName: string, args: Record<string, any>): Promise<string> {
    // Your implementation
    return 'result'
  }
}

Module Format ​

Plugins must be in ESM (ECMAScript Module) format:

  • Use export and import statements
  • File extension should be .esm.js or .esm.mjs
  • Avoid CommonJS (require, module.exports)

Release Requirements ​

Your GitHub release must include exactly two assets:

1. manifest.json ​

  • Content type: application/json
  • Contains your plugin manifest

2. plugin.tgz ​

  • Content type: application/octet-stream
  • Tarball archive containing all runtime files
  • Must include everything your plugin needs to run

Example plugin.tgz structure:

plugin.tgz
├── dist/
│   ├── index.esm.js    # Your bundled plugin code
│   └── icon.svg        # Plugin icon

Or for non-bundled plugins:

plugin.tgz
├── src/
│   └── index.esm.js    # Your plugin code
└── public/
    └── icon.svg        # Plugin icon

Next Steps ​