gotify/server · error
plugin does not support %s
Error message
plugin does not support %s
What it means
supportOrAbort checks whether a plugin instance implements a required capability (compat.Capability) via compat.HasSupport. If the plugin lacks the module, the handler writes a 400 response with "plugin does not support <capability>" and aborts the request chain. It is a guard used by API handlers that delegate functionality to a pluggable backend.
Source
Thrown at api/plugin.go:415
}
if err := instance.ValidateAndSetConfig(newConf); err != nil {
ctx.AbortWithError(400, err)
return
}
conf.Config = newconfBytes
successOrAbort(ctx, 500, c.DB.UpdatePluginConf(conf))
})
}
func isPluginOwner(ctx *gin.Context, conf *model.PluginConf) bool {
return conf.UserID == auth.GetUserID(ctx)
}
func supportOrAbort(ctx *gin.Context, instance compat.PluginInstance, module compat.Capability) (aborted bool) {
if compat.HasSupport(instance, module) {
return false
}
ctx.AbortWithError(400, fmt.Errorf("plugin does not support %s", module))
return true
}
View on GitHub (pinned to 14bfc25627)
Solutions
- Use or configure a plugin instance that implements the required capability (verify with compat.HasSupport).
- Check the plugin configuration so the endpoint resolves to the correct instance with the module enabled.
- Upgrade or rebuild the plugin to a version that supports the missing module.
- If the endpoint is not needed, stop calling it or guard the client code against 400 responses carrying this message.
Example fix
// before: calling endpoint backed by a plugin without the module
client.Storage.Download(ctx, file) // -> 400 plugin does not support storage
// after: pick an instance that supports the capability
if !compat.HasSupport(instance, module) {
instance = loadInstanceWithModule(module)
} Defensive patterns
Strategy: validation
Validate before calling
if !compat.HasSupport(instance, module) {
// skip the call or choose another instance
return
} Type guard
func supportsModule(instance compat.PluginInstance, module compat.Capability) bool {
return compat.HasSupport(instance, module)
} Prevention
- Check capability support before invoking plugin-backed endpoints.
- Pin plugin versions known to implement all required modules.
- Validate plugin config at startup and fail fast on missing modules.
When it happens
Trigger: Calling any API handler that routes through supportOrAbort when the configured plugin instance does not implement the requested capability module (e.g. an auth or storage plugin lacking the module the endpoint requires).
Common situations: Deploying with a minimal or legacy plugin build that omits a capability; misconfiguring the plugin so a different instance (without the module) is selected; upgrading Gitea/woodpecker-style plugin interfaces and forgetting to enable a module.
Related errors
- cannot delete internal application
- file with key 'file' must be present
- file must be an image
- invalid file extension
- sort key is not unique
AI-assisted analysis of gotify/server@14bfc25627 (2026-09-05).
Data as JSON: /api/errors/003e9631d39542c3.
Report an issue: GitHub.