How the plugin platform works
A plugin is a standalone frontend JavaScript application that runs in an iframe inside the Tracker app. An SDK is provided for its development. Using React is considered a priority. There is also a vanilla JavaScript library that allows you to avoid being tied to React.
The platform covers the entire lifecycle of plugins: it provides tools for development and debugging, versioning, and publishing, as well as a repository for storing plugins. Administrators can install, update, and disable plugins, controlling their availability to users and contexts.
Running a plugin in an iframe
The interface part of plugins is static content hosted on Tracker's servers. It runs in an isolated iframe on a cookieless domain, where almost everything is forbidden, including any network requests. Therefore, all communication with Yandex services, the Tracker public API, and the outside world is done through the SDK.
SDK
Interacting with Tracker is done using the SDK, which is connected as a library. The SDK provides methods for interaction at the user interface level, methods for working with the Tracker public API, and a plugin data storage.
The SDK is delivered as two npm packages:
- core — API client and basic integration primitives (JS/TS).
- react — React wrappers over core for easy UI development.
CLI
CLI is a command-line utility in the form of an NPM package that covers the entire plugin lifecycle: creation, debugging, validation, and publishing.
UI components
A library of UI components in Tracker's style, available for use in plugins.
Manifest
The manifest is a manifest.json file in the project's root directory. It describes the plugin, the requested permissions, and integration points with Tracker.
JSON Schema
When creating a project, CLI adds a manifest.schema.json file next to the manifest and specifies it in the $schema field:
{
"$schema": "./manifest.schema.json"
}
The code editor uses the schema to validate the manifest, provide autocomplete, and show allowed values. CLI validates the manifest against the built-in schema even if the $schema field is missing. Do not edit manifest.schema.json manually. To update the local schema and other template files, run weavix up.
Restrictions and lists of allowed values may change. Check them in the manifest.schema.json of the current project.
Manifest fields
|
Field |
Type |
Required |
Description |
|
|
|
No |
Path to the JSON Schema. CLI adds the value |
|
|
|
No |
Manifest format version. CLI adds the value |
|
|
|
No |
Services where the plugin works. For a Tracker plugin, specify |
|
|
|
Yes |
Unique plugin name consisting of lowercase Latin letters, numbers, and hyphens. Length: 3 to 63 characters |
|
|
|
No |
Plugin ID on the platform. CLI adds it during registration when you first run the |
|
|
|
Yes |
Plugin version in SemVer format, for example, |
|
|
|
Yes |
Name in Russian and English in the |
|
|
|
Yes |
Description in Russian and English in the |
|
|
|
Yes |
Non-empty list of support contacts. Each object contains |
|
|
|
Yes |
Permissions required by the plugin. The object must contain the |
|
|
|
No |
Integration points of the plugin with the services interface |
|
|
|
No |
Categories by which the plugin is displayed in the catalog |
|
|
|
No |
Address of the plugin help |
|
|
|
No |
Plugin website address with the HTTP or HTTPS protocol |
|
|
|
No |
License identifier up to 32 characters, for example, |
|
|
|
No |
Unique keywords for searching the plugin. Length of each value: up to 30 characters |
|
|
|
No |
Description of changes in the version, up to 300 characters |
|
|
|
No |
HTTPS address from which the plugin interface is loaded. Using an external host requires approval from the Tracker team |
Configuring slots
A plugin can use multiple integration points. For each point, specify:
entrypoint— path to the entry HTML file;title— interface element name in Russian and English;contextLevel— level of data available to the plugin:basic— ID of the current entity and basic metadata;full— full entity object, for example, all issue fields;
description— optional description in Russian and English;icon— optional object with a path to the icon in theurlfield. Used in thedockslot.
Use full only if the plugin needs the full entity object.
The slots field is not required by the manifest format, but you must configure at least one slot to validate and publish the project.
"slots": {
"tracker": {
"issue.action": [
{
"entrypoint": "index.html",
"contextLevel": "basic",
"title": {
"ru": "Мой плагин",
"en": "My Plugin"
}
}
]
}
}
Permissions
In the manifest, specify only the permissions that the plugin needs. The permissions object contains the following fields:
data— required array of permissions for working with Tracker data. Permissions have the formattracker:<resource>:readfor reading andtracker:<resource>:writefor modifying data. For example,tracker:issues:readallows reading issues,tracker:issues:writeallows modifying them, andtracker:attachments:writeallows uploading attachments. The current list of allowed values is provided inmanifest.schema.json;device— access to the user's device capabilities. Allowed values:clipboard-write,microphone,camera,geolocation,web-share, andallow-downloads. If supported by the browser, the user must additionally allow access to the selected capability;ui— additional actions in the Tracker interface. Add such a permission only if it's specified in the description of the SDK method you're using;external— domains of external APIs and authorization parameters. Direct requests to such APIs from the plugin are forbidden: the platform proxy handles them. For more information, see External APIs.
Access level
A permission in the manifest does not extend the user's rights. All actions are performed on behalf of the current user and within the rights granted to them.
Plugin data storage
The platform provides a unified plugin data storage and an API for working with it, which supports two modes:
-
Contextual storage [Coming soon] — data is linked to a specific Tracker entity and a granularity level (
organization,user,queue,portfolio,project,issue,issue-comment). This is suitable for settings and states that depend on an organization, user, queue, or specific issue. The storage context does not have to match the plugin installation context. -
Key-value mode — data is stored as
key → valuepairs in the plugin's namespace. This is suitable for simple configurations and service data where quick access by key is more important than linking to a domain entity.
In both modes, the API covers reading, writing, updating, and deleting data, supports concurrent change control (versioning/optimistic locking), and stores pluginVersion for managed data migrations when the plugin is updated.
For more information about the current storage implementation and its API, see the Plugin data storage section.
Access to external APIs (OAuth and proxy)
The platform provides a secure mechanism for integrations with external services: a platform proxy for making HTTP requests and a secret vault for storing OAuth tokens.
-
Platform proxy — a single endpoint for calling external APIs on behalf of the plugin. The plugin sends the request parameters: URL, method, headers, body. The platform executes the request on the backend and returns the result. Access is restricted declaratively (domain allowlist). The platform blocks unsafe destinations (private networks/localhost, unauthorized redirects), runs audits, and applies rate limits per
pluginIdand organization. -
OAuth and Secret vault — the platform takes over the OAuth flow and token storage: access/refresh tokens are saved in the secret vault and never end up in the plugin's iframe. Tokens are supported in two contexts:
user(personal) andorganization(shared across the organization, created by the administrator). When making requests through the proxy, the platform automatically inserts the appropriate token, and upon expiration, it either performs a refresh on the backend or signals the need for re-authorization.
For more information on how to call external APIs from a plugin, see the External APIs section.
Integration points (slots)
The location where the plugin will be opened, as well as the mechanism for invoking it (such as a button or as part of a form), is determined by the slot. The slot is specified in the manifest.
Available slots and details of their use are described in the Integration points section.
Plugin launch context
The plugin launch context is determined by the slot it is in and contains the following information:
- Current Tracker theme
- Current Tracker language
- Slot context — data from the environment of the page where the plugin is running. For example, in the
issue.actionslot, information about the open issue will be returned. The context format is as close to the public API types as possible.
Slot context levels
The context level is set by the contextLevel parameter in the slot description in manifest.json and determines what data will be available to the plugin via useTrackerPluginContext.
basic
Only the current entity ID and basic metadata are available:
type BasicContext = {
/** Current entity ID */
entityId: string;
/** Additional basic information about the entity.
* For example, for a comment, this will contain the parent issue ID. */
entityMeta?: Record<string, string>;
};
Use basic if the plugin only needs to know the entity ID — this is a lighter option without unnecessary overhead.
full
Full context with live entity data. The format matches the public API types. For example, for the issue.action slot, it's the full Issue object. The data is up to date as of the moment the plugin is opened.
Use full only if the plugin really needs the full entity data.
Choosing a context level
Request only the context level that the plugin actually needs. If you don't need full entity data, use basic.