Skip to main content

Kinds

kind tells Timon what a plugin is; slots tell it where that plugin inserts components. These must agree.

KindSurface
widgetAt least one slot ending in .widget
pagepage, with a declared route
islandExact island.content slot; a workspace tab or split (API 8)
overlayExact overlay slot, inside the app window
themeSingle theme slot
composerSingle chat.composer slot
layoutSingle root slot
behaviorEffects or settings without a required visual kind
providerBrings an AI provider (backends:register); declares the programs it launches in provider.binaries. No slot
dictationExact dictation.engine slot; a speech-to-text engine that says where the voice goes (dictation:engine, API 14)
bundleInstalls contains; no browser half

A string is shorthand for a one-element list. A plugin can declare ['widget', 'overlay'] and register both surfaces in the same apply. They remain one identity. plugin-hello likewise registers navigation and a widget without becoming a bundle.

A bundle is exclusive: it cannot combine bundle with another kind or include a browser half. Only bundles may declare nonempty contains. Each child keeps its own identity and independent toggle.

A missing kind is inferred from recognised slots. A plugin with no recognised visual kind becomes behavior; there is no separate settings kind. Declare settings fields or exact settings slots instead.

island requires client.slots to contain island.content exactly; a widget zone cannot substitute for it. When kind is omitted, that slot infers island. For a plugin with both a card and island content, declare "kind": ["widget", "island"] and both slots. Use apiVersion: 8 for the island client helpers; see the complete template.

A provider plugin needs the backends:register permission and may list, in provider.binaries, the bare names (never paths) of the programs it launches. See Write a provider.

A dictation plugin needs apiVersion: 14, the dictation:engine permission and a dictation block that lists its engines and where each sends the voice. The dictation.engine slot and the dictation block are refused under any other kind. See Write a dictation engine.