Skip to content

obsidian/plugin/plugin-lifecycle-events

The lifecycle broadcast every PluginBase makes: obsidian-dev-utils:plugin-loaded when it has finished loading and obsidian-dev-utils:plugin-unloaded when it goes away.

Obsidian gives a plugin no way to learn that ANOTHER plugin was enabled or disabled — there is no such event on app.plugins, and a plugin’s own Events source cannot help a listener that does not yet hold the instance. So the broadcast goes through app.workspace, which is one object every plugin in the vault can reach. Deliberately NOT the globalThis.__obsidianDevUtils bag the rest of the library shares its state through: a listener there needs its own copy of this library, and these events are meant to be consumable by any plugin at all.

The names are past tense because a broadcast states something that has already happened. loaded in particular carries a guarantee: it is triggered only after every API the plugin declares has been published, so a listener may call them immediately.

Both the event names and PluginLifecycleEventPayload are a CROSS-VERSION CONTRACT. Copies of this library at different versions publish and consume them side by side in one vault, so neither may change incompatibly: plain data only, and new payload fields only ever added.

InterfaceDescription
PluginLifecycleEventPayloadThe payload of PLUGIN_LOADED_EVENT_NAME and PLUGIN_UNLOADED_EVENT_NAME. Plain data by design — no class instances and no types owned by this library — because it crosses between independently bundled copies of it, and between plugins that do not use it at all.
TriggerPluginLifecycleEventParamsParameters for triggerPluginLifecycleEvent.
FunctionDescription
triggerPluginLifecycleEventTriggers one of the two lifecycle events on the app’s workspace. A thin typed wrapper over Workspace.trigger, which accepts any event name and any arguments, so that the one place a payload is constructed is checked against PluginLifecycleEventPayload.
TypeDescription
PluginLifecycleEventNameThe name of either lifecycle event.
VariableDescription
PLUGIN_LOADED_EVENT_NAMETriggered once a plugin has finished loading AND published every API it declares, so a listener may call those APIs immediately. Namespaced by the package name rather than by an abbreviation of it: the event is global to the vault and aimed at plugin authors who have never heard of this library, so the prefix has to identify itself.
PLUGIN_UNLOADED_EVENT_NAMETriggered as a plugin unloads — whether the user disabled it, uninstalled it, or Obsidian is shutting down. Its APIs are revoked by the time a listener runs.