Budibase/budibase · error

Only component plugins are supported outside of self-host

Error message

Only component plugins are supported outside of self-host

What it means

When processing an uploaded plugin, non-self-host (cloud) deployments only accept component-type plugins. processUploaded validates the plugin's schema type and throws this error if a non-component plugin (e.g. datasource, automation) is uploaded outside self-host.

Source

Thrown at packages/server/src/sdk/plugins/index.ts:134

          plugin?.name,
          err instanceof Error ? err.message : String(err)
        )
      }
    }
    if (updated > 0) {
      console.log(`Backfilled GitHub origin for ${updated} plugin(s).`)
    }
  })
}

export async function processUploaded(plugin: KoaFile, source: PluginSource) {
  const { metadata, directory, cleanupDirectory } = await fileUpload(plugin)
  try {
    pluginCore.validate(metadata.schema)

    // Only allow components in cloud
    if (!env.SELF_HOSTED && metadata.schema?.type !== PluginType.COMPONENT) {
      throw new Error(
        "Only component plugins are supported outside of self-host"
      )
    }

    // Only allow Svelte 5 plugins on this branch
    if (
      metadata.schema?.metadata?.svelteMajor !== 5 &&
      metadata.schema?.type === PluginType.COMPONENT
    ) {
      throw new Error("Only Svelte 5 plugins are supported on this branch")
    }

    const doc = await pro.plugins.storePlugin(metadata, directory, source)
    clientAppSocket?.emit("plugin-update", { name: doc.name, hash: doc.hash })
    return doc
  } finally {
    deleteFolderFileSystem(cleanupDirectory)
  }

View on GitHub (pinned to a81a902e9a)

Solutions

  1. Host the plugin on a self-hosted Budibase installation instead of cloud.
  2. Change the plugin's schema type to COMPONENT if it is actually a component plugin.
  3. Check the plugin's schema.json / bundled metadata to confirm the declared type is correct.
  4. Verify env.SELF_HOSTED is set correctly for your deployment type.

Example fix

// before (schema.json)
{ "type": "datasource", ... }
// after
{ "type": "component", ... }
Defensive patterns

Strategy: validation

Validate before calling

if (!env.SELF_HOSTED && plugin.metadata?.schema?.type !== "component") {
  throw new Error("Upload non-component plugins only on self-host installs")
}

Type guard

const isComponentPlugin = (m: PluginMetadata): boolean => m.schema?.type === PluginType.COMPONENT

Prevention

When it happens

Trigger: Uploading or watching a plugin whose metadata.schema.type is DATASOURCE, AUTOMATION-BLOCK, etc. while env.SELF_HOSTED is false - e.g. POST to the plugin upload endpoint or plugin file watch on a cloud install.

Common situations: A plugin developer tests a datasource plugin against a cloud-hosted Budibase instance; a self-host plugin bundle is uploaded to Budibase Cloud where only component plugins are licensed.

Related errors


AI-assisted analysis of Budibase/budibase@a81a902e9a (2026-08-29). Data as JSON: /api/errors/72b438a715f89df8. Report an issue: GitHub.