Skip to main content

Overview

Hooks allow plugins to expose extension points that other plugins can register handlers for. Unlike events (fire-and-forget), hooks collect return values.

API

api.registerHook(name, handler)

Register a function that responds to a named hook.

api.useHook(name, payload)

Call all registered handlers for a hook. Returns an array of their return values. Returns: Array<any> — return values from each handler (empty array if none registered).

api.removeHook(name, handler)

Remove a previously registered handler. Must pass the same function reference.
Call removeHook in your teardown() function to clean up extension points when your plugin is disabled.

Hooks vs Events

When to Use Each

Use Events When:

  • You’re broadcasting that something happened
  • You don’t need a response
  • Multiple plugins might be interested
  • Example: todo:added, theme:changed

Use Hooks When:

  • You’re exposing an extension point
  • You need return values from handlers
  • You want plugins to contribute to your UI
  • Example: toolbar:add-button, sidebar:add-section

Timing

Hooks are typically registered during setup(), but they’re also commonly invoked after all plugins have loaded. Use the board:allPluginsLoaded event for this:

Example: Extensible Sidebar