# Plugin Manifest (plugin.yaml)

Located at `src/main/resources/plugin.yaml`. Required.

> - [create-halo-plugin repo](https://github.com/halo-dev/create-halo-plugin)

## Minimal Example

```yaml
apiVersion: plugin.halo.run/v1alpha1
kind: Plugin
metadata:
  name: hello-world
spec:
  enabled: true
  requires: ">=2.22.0"
  author:
    name: Halo
    website: https://www.halo.run
  logo: logo.svg
  displayName: "Hello World"
  description: "A minimal Halo plugin"
  license:
    - name: "GPL-3.0"
      url: "https://github.com/example/plugin/blob/main/LICENSE"
```

## Field Reference

| Field                                 | Description                                                                                               | Required    |
| ------------------------------------- | --------------------------------------------------------------------------------------------------------- | ----------- |
| `apiVersion` / `kind`                 | Fixed: `plugin.halo.run/v1alpha1` / `Plugin`                                                              | Yes         |
| `metadata.name`                       | Unique plugin ID. Max 253 chars, lowercase letters/numbers/hyphens only, must start/end with alphanumeric | Yes         |
| `spec.enabled`                        | Auto-enable on install. For production, prefer `false` for security                                       | Yes         |
| `spec.requires`                       | Supported Halo version range. SemVer ranges: `>=2.22.0`, `^2.22.0`, `2.22.*`, etc.                        | Yes         |
| `spec.version`                        | Plugin version (e.g., `1.0.0`)                                                                            | Recommended |
| `spec.author.name` / `author.website` | Author info                                                                                               | Recommended |
| `spec.logo`                           | Logo file (relative to `src/main/resources/`) or URL                                                      | Recommended |
| `spec.displayName`                    | Human-readable name                                                                                       | Yes         |
| `spec.description`                    | Short description                                                                                         | Yes         |
| `spec.homepage`                       | Plugin homepage/docs URL                                                                                  | Recommended |
| `spec.repo`                           | Source repository URL                                                                                     | Recommended |
| `spec.issues`                         | Issue tracker URL                                                                                         | Recommended |
| `spec.license`                        | License name + URL array                                                                                  | Recommended |
| `spec.settingName`                    | Setting resource name for plugin config form. Suffix with `-settings`                                     | Optional    |
| `spec.configMapName`                  | ConfigMap name for persisting config. Suffix with `-configmap`. Required if `settingName` is set          | Conditional |
| `spec.pluginDependencies`             | Map of `pluginName: versionRange`. Optional deps suffix name with `?` (Halo 2.20.11+)                     | Optional    |

## Plugin Dependencies

For dependency design, optional dependencies, and API modules, see
[plugin-interaction.md](plugin-interaction.md).

```yaml
spec:
  pluginDependencies:
    # Required dependency
    some-plugin: ">=1.0.0 & <2.0.0"
    # Optional dependency (Halo 2.20.11+)
    optional-plugin?: "1.*"
```

## Settings & ConfigMap

To provide a user-configurable form in Console:

1. Set `spec.settingName: my-plugin-settings` and `spec.configMapName: my-plugin-configmap` in `plugin.yaml`
2. Create `src/main/resources/extensions/settings.yaml`:

```yaml
apiVersion: v1alpha1
kind: Setting
metadata:
  name: my-plugin-settings # must match spec.settingName
spec:
  forms:
    - group: basic
      label: Basic Settings
      formSchema:
        - $formkit: text
          name: apiKey
          label: API Key
        - $formkit: switch
          name: enabled
          label: Enable Feature
```

> If `settingName` is set but the corresponding `Setting` resource does not exist, the plugin will fail to start.
>
> For full form input options and Vue component usage, see [ui-forms.md](ui-forms.md).
>
> After setting this up, read the config at runtime using [`ReactiveSettingFetcher` or `SettingFetcher`](server-shared-beans.md#reactivesettingfetcher--settingfetcher).

## App Store Annotations

For distribution via Halo App Store:

```yaml
metadata:
  annotations:
    store.halo.run/app-id: "app-XXXXX"
```
