Skip to main content
Every plugin must include a plugin.json at its root. The shell reads this file to discover, validate, and register your plugin before loading any code. Point your editor at the JSON Schema for autocomplete and inline validation:
Every multi-word key in plugin.json is snake_case: available_settings, min_core_version, include_source_maps and attaches_files_to_pirep. Setting key values are yours to name. An upload with a key that isn’t listed on this page is refused.

Required Fields

id

Type: string Unique identifier for your plugin. Used internally for routing, IPC namespacing, config storage, and CDN distribution paths. Rules: lowercase alphanumeric and hyphens only. Must be unique across all installed plugins.

name

Type: string Display name shown in the sidebar and settings screens.

version

Type: string Semantic version string. Must match the version in latest.json on the CDN when distributing updates.

description

Type: string Short description of what the plugin does. Displayed in the plugin info panel.

type

Type: "user" | "airline" Controls how the plugin is distributed:
  • "airline": Managed by the VA admin platform. Required plugins are synced automatically to all pilots when they authenticate. The VA admin controls which version pilots receive.
  • "user": Installed by individual pilots from the plugin store. Each pilot can install or remove it independently.

author

Type: PluginAuthor

icon_light and icon_dark

Type: string Relative paths to sidebar icons: one for light theme, one for dark theme.
Icon requirements:
  • Place files in assets/ at the plugin root (e.g. assets/icon-light.svg)
  • SVG or PNG format
  • Square aspect ratio
  • Both variants required: the shell switches between them based on the active theme

Background Modules

Background modules do not require any manifest configuration. The shell discovers them automatically by convention: if a background/index.js file exists in your plugin’s root directory, the shell loads it as a background service in the Electron main process. See Background Module for the module contract.

Optional Fields

homepage

Type: string Optional URL pointing to the plugin’s homepage, documentation site, or GitHub repository. When set, the plugin info panel in Stratos Settings renders it as a clickable link that opens in the user’s default browser. Must be a fully-qualified http:// or https:// URL. Other schemes are ignored.

min_core_version

Type: string The oldest Stratos Core your plugin runs on, as a semantic version. Set it when you use something only a newer core provides, such as DynamicIcon (core 2.49.0). An older core won’t install the plugin, an update leaves the installed version in place, and a copy already installed shows “Needs Stratos Core or newer. Restart Stratos to update.” instead of starting.

include_source_maps

Type: boolean (default false) Whether the published bundle keeps your source maps. By default they are stripped when the version is published. Set it to true if you want pilots to have them for debugging.

attaches_files_to_pirep

Type: boolean Declares that your plugin attaches files to the PIREP. It’s advisory metadata. Attaching files changes how the flight submission is encoded for the airline, so see PIREP file attachments.

available_settings

Type: array Declares configurable settings for your plugin. Stratos shows the user-scoped ones on your plugin’s page in Settings → Plugins. Each setting has: Setting types: Scopes:
  • "user": each pilot sets their own value in Stratos Settings → Plugins.
  • "airline": set by the airline on skyvexsoftware.com and not shown to pilots in Stratos. Changes reach Stratos while it’s running, never mid-flight (see ctx.config.onChange). Use for airline-wide config like welcome messages, event rules or feature flags.

Full Example