Skip to main content
Plugins are built with Vite using a shared config factory from the SDK. The output is zipped and uploaded to the Skyvex website for distribution.

Vite Configuration

Use createPluginConfig() from the SDK:
// vite.config.ts
import { createPluginConfig } from "@skyvexsoftware/stratos-sdk/vite";
import tailwindcss from "@tailwindcss/vite";

export default createPluginConfig({
  ui: { entry: "src/ui/index.tsx" },
  background: { entry: "src/background/index.ts" }, // optional
  vite: {
    plugins: [tailwindcss()],
  },
});
The vite option accepts any Vite config to merge in — plugins, resolve aliases, CSS config, etc. If you only have a UI module, omit the background field.

Build Scripts

With background module:
{
  "scripts": {
    "dev": "vite",
    "build": "vite build && cross-env BUILD_TARGET=background vite build",
    "build:ui": "vite build",
    "build:bg": "cross-env BUILD_TARGET=background vite build"
  }
}
UI-only plugin:
{
  "scripts": {
    "dev": "vite",
    "build": "vite build"
  }
}
Use cross-env for Windows compatibility with the BUILD_TARGET environment variable.

How the Build Works

UI build (default): Compiles your React code into a single ESM bundle. Shared dependencies are externalised and resolved from the shell at runtime via window.__stratos_modules__. Background build (BUILD_TARGET=background): Compiles your Node.js module into an ESM bundle. Electron, Node.js builtins, and the SDK are externalised.

What Gets Externalized

You do not need to bundle these — the shell provides them at runtime: UI externals:
  • react, react-dom
  • @tanstack/react-query, @tanstack/react-router
  • @skyvexsoftware/stratos-sdk
  • sonner, socket.io-client
  • maplibre-gl, react-map-gl/maplibre
Background externals:
  • electron
  • @skyvexsoftware/stratos-sdk
  • socket.io-client
  • All Node.js built-in modules
Anything else you import (e.g. lucide-react, your own utilities) will be bundled into your plugin.

Build Output

After pnpm build, the dist/ directory contains:
dist/
├── plugin.json                ← copied from root
├── assets/                    ← icons and static assets
│   ├── icon-light.svg
│   └── icon-dark.svg
├── ui/
│   └── index.js               ← bundled UI module (ESM)
└── background/                 ← only if background module exists
    └── index.js               ← bundled background module (ESM)

Development Workflow

Live Reload Development

The recommended development workflow uses the Stratos app’s dev mode:
  1. Open Stratos with the --dev flag
  2. Log in and select your airline
  3. In your plugin directory:
pnpm dev
Your plugin’s Vite dev server auto-connects to Stratos via Socket.io. The plugin appears in the sidebar immediately. Code changes auto-reload in about a second.
✓ Vite dev server running at http://localhost:5174
✓ Connected to Stratos (localhost:2066)
✓ Plugin "my-plugin" mounted
ChangeBehavior
UI component code (src/ui/**)Auto-reloads on save
CSS / Tailwind classesAuto-reloads on save
Background module (src/background/**)Auto-rebuilds and hot-reloads
plugin.jsonRestart pnpm dev
New dependenciesRun pnpm install then restart pnpm dev

Manual Testing (No Dev Server)

If you prefer to test with a production build:
  1. Run pnpm build
  2. Copy the dist/ contents to Stratos’s plugins directory:
PlatformPath
macOS~/Library/Application Support/Stratos/plugins/my-plugin/
Windows%APPDATA%\Stratos\plugins\my-plugin\
Linux~/.config/Stratos/plugins/my-plugin/
  1. Restart Stratos — it discovers plugins by finding plugin.json in each subdirectory.
Tip: Symlink your dist/ directory to skip the copy step:
# macOS
ln -s "$(pwd)/dist" ~/Library/Application\ Support/Stratos/plugins/my-plugin

Deploying

Upload to Skyvex

When your plugin is ready:
  1. Bump the version in plugin.json
  2. Run pnpm build
  3. Zip the dist/ directory
  4. Upload to the Skyvex website

Airline Plugin Sync

When a plugin has "type": "airline", the VA platform manages distribution. Stratos automatically syncs required plugins on authentication:
  1. Pilot logs in to their VA
  2. Shell fetches the VA’s required plugin list
  3. Missing plugins are downloaded and installed automatically
  4. Updates are applied automatically when new versions are published
For "user" type plugins, pilots install them manually.

CDN Layout

Plugin artifacts are stored at:
cdn.skyvexsoftware.com/stratos/plugins/
  {author.id}/
    {plugin.id}/
      latest.json                    ← current version metadata
      {version}/
        bundle.zip                   ← plugin bundle for this version

latest.json Format

{
  "version": "1.1.0",
  "sha256": "abc123...",
  "minShellVersion": "1.20.0",
  "updatedAt": "2026-02-25T10:00:00Z"
}
The shell’s plugin updater reads latest.json to detect available updates, verifies integrity via SHA256, and checks shell version compatibility before installing.