Skip to content

Plugin Manifest Reference

Every plugin must include a omnilux-plugin.json file at its root. This file describes the plugin to OmniLux's loader.

Full schema

json
{
  "name": "omnilux-plugin-example",
  "version": "1.0.0",
  "displayName": "Example Plugin",
  "description": "A description of what this plugin does",
  "category": "notification-agent",
  "icon": "bell",
  "author": "Your Name",
  "license": "MIT",
  "compatibility": {
    "omnilux": ">=0.1.0",
    "api": ">=1"
  },
  "dependencies": [
    {
      "name": "omnilux-plugin-other",
      "version": ">=1.0.0",
      "optional": false
    }
  ],
  "permissions": [
    "network:outbound",
    "notifications:send"
  ],
  "entry": "src/index.ts",
  "adapters": [
    {
      "type": "NotificationAgentAdapter",
      "id": "my-agent",
      "displayName": "My Agent",
      "description": "Sends notifications to my service"
    }
  ],
  "routes": [
    {
      "path": "/api/my-plugin/webhook",
      "method": "POST",
      "description": "Receive webhooks from my service"
    }
  ],
  "settingsUI": {
    "entry": "src/ui/settings.ts",
    "tabId": "my-plugin",
    "displayName": "My Plugin Settings"
  },
  "migrations": [
    {
      "id": "001-create-tables",
      "path": "migrations/001-create-tables.sql",
      "description": "Create plugin tables"
    }
  ],
  "backgroundJobs": [
    {
      "id": "my-sync-job",
      "schedule": "15m",
      "description": "Sync data every 15 minutes"
    }
  ]
}

Field reference

Required fields

FieldTypeDescription
namestringUnique plugin identifier. Must be lowercase, alphanumeric with hyphens. Convention: omnilux-plugin-<name>
versionstringSemVer version string (e.g., 1.0.0)
displayNamestringHuman-readable name shown in the UI
descriptionstringShort description of the plugin's purpose
categoryPluginCategoryPlugin category (see below)
compatibilityobjectVersion constraints
permissionsPermission[]Required permissions (see Permissions)
entrystringPath to the plugin's entry point (must export a register function)

Optional fields

FieldTypeDescription
iconstringIcon name or emoji for the plugin
authorstringAuthor name
licensestringSPDX license identifier
dependenciesPluginDependency[]Other plugins this plugin depends on
adaptersPluginAdapterManifest[]Adapters this plugin provides
routesPluginRouteManifest[]API routes this plugin registers
settingsUIPluginSettingsUiManifestSettings panel registration
migrationsPluginMigrationManifest[]Database migrations
backgroundJobsPluginBackgroundJobManifest[]Scheduled background jobs

Categories

CategoryDescription
download-clientDownload client integration
indexerSearch indexer
vpnVPN management
scannerFile scanning
searchSearch pipeline
iptv-sourceIPTV channel sources
game-sourceGame download sources
notification-agentNotification delivery
metadata-providerMetadata lookups
arr-service*arr stack interop
integrationExternal service integration
uiUI enhancements
utilityGeneral utilities

Compatibility

json
{
  "compatibility": {
    "omnilux": ">=0.1.0",
    "api": ">=1"
  }
}
  • omnilux — required. SemVer range for compatible OmniLux versions
  • api — optional. API version constraint

Dependencies

json
{
  "dependencies": [
    {
      "name": "omnilux-plugin-other",
      "version": ">=1.0.0",
      "optional": false
    }
  ]
}
  • name — plugin name to depend on
  • version — SemVer range
  • optional — if true, the plugin loads even if the dependency is missing

Adapter manifest

json
{
  "type": "NotificationAgentAdapter",
  "id": "my-agent",
  "displayName": "My Agent",
  "description": "Description shown in the UI"
}
  • type — must match a valid AdapterKind
  • id — unique identifier for this adapter within its type

Route manifest

json
{
  "path": "/api/my-plugin/webhook",
  "method": "POST",
  "description": "Receive incoming webhooks"
}
  • method — HTTP method. Defaults to GET if omitted

Background job manifest

json
{
  "id": "my-sync-job",
  "schedule": "15m",
  "description": "Sync data periodically"
}
  • schedule — interval string: 30s, 5m, 1h, 24h, etc.

Validation rules

  • name must be unique across all installed plugins
  • version must be a valid SemVer string
  • entry must point to an existing file
  • permissions must only contain valid Permission values
  • adapters[].type must be a recognized AdapterKind
  • migrations must have unique id values and existing path references

Invalid manifests are rejected at install time with descriptive error messages.

Use OmniLux, run your own server, or build on the platform.