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.Documentation Index
Fetch the complete documentation index at: https://docs.skyvexsoftware.com/llms.txt
Use this file to discover all available pages before exploring further.
Vite Configuration
UsecreatePluginConfig() from the SDK:
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: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 viawindow.__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.
CSS and Static Assets
Plugins are loaded at runtime viaimport(), so CSS and assets must be embedded in the JS bundle — separate files won’t be loaded.
CSS injection is handled automatically. Any CSS you import (including Tailwind output from @tailwindcss/vite) is injected into the DOM as a <style> tag when your plugin module loads. The shell wraps all plugin CSS in @layer plugin to prevent your styles from overriding the shell’s UI — you don’t need to do anything special for this.
Your plugin’s styles.css should include Tailwind and a @source directive so Tailwind can find your component files:
src/ui/styles.css
src:
.svg, .png, .jpg, .webp, .woff2, etc.).
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-sdksonner,socket.io-clientmaplibre-gl,react-map-gl/maplibre
electron@skyvexsoftware/stratos-sdk(except/helpers, which is bundled into your plugin)socket.io-client- All Node.js built-in modules
lucide-react, your own utilities) will be bundled into your plugin.
Build Output
Afterpnpm build, the dist/ directory contains:
ui/index.js — there are no separate .css files in the output.
Development Workflow
Live Reload Development
The recommended development workflow uses the Stratos app’s dev mode:- Open Stratos with the
--devflag - Log in and select your airline
- In your plugin directory:
| Change | Behavior |
|---|---|
UI component code (src/ui/**) | Auto-reloads on save |
| CSS / Tailwind classes | Auto-reloads on save |
Background module (src/background/**) | Auto-rebuilds and hot-reloads |
plugin.json | Restart pnpm dev |
| New dependencies | Run pnpm install then restart pnpm dev |
Manual Testing (No Dev Server)
If you prefer to test with a production build:- Run
pnpm build - Copy the
dist/contents to Stratos’s plugins directory:
| Platform | Path |
|---|---|
| macOS | ~/Library/Application Support/Stratos/plugins/my-plugin/ |
| Windows | %APPDATA%\Stratos\plugins\my-plugin\ |
| Linux | ~/.config/Stratos/plugins/my-plugin/ |
- Restart Stratos — it discovers plugins by finding
plugin.jsonin each subdirectory.
dist/ directory to skip the copy step:
Deploying
Quick Deploy
The SDK includes astratos-deploy CLI that bundles and uploads your plugin in one step:
pnpm build, zips dist/ into bundle.zip, and uploads it to the Skyvex API. Your package.json should have:
create-stratos-plugin, this script is already included.
Authentication
Generate an API key from your account settings at skyvexsoftware.com, then set it as an environment variable:plugin.json automatically. On success, the Skyvex server validates, signs, and publishes your plugin to the CDN.
Manual Upload
If you don’t have an API token or prefer to upload through the website:SKYVEX_API_TOKEN, the command still builds and creates bundle.zip — it just skips the upload and tells you where to upload manually at skyvexsoftware.com.
CI/CD
For automated deployments, setSKYVEX_API_TOKEN as a secret in your CI environment:
What Happens After Upload
- The Skyvex API validates your
plugin.jsonmanifest - An
.integrityfile is generated with SHA256 hashes for every file in your bundle - The bundle is signed with Ed25519 and republished to the CDN
latest.jsonis updated so Stratos clients detect the new version- Users receive the update automatically
Troubleshooting
| Error | Cause | Fix |
|---|---|---|
| ”No built plugin found” | dist/ doesn’t exist | Run pnpm build first, or use pnpm bundle which builds automatically |
| ”Version X already exists” | This version is already published | Bump the version in plugin.json |
| ”Authentication failed” | Invalid or expired token | Generate a new token at skyvexsoftware.com |
| ”Permission denied” | Token doesn’t own this plugin | Check you’re using the correct account’s token |
| ”Build output incomplete” | dist/ui/index.js is missing | Check your Vite config and build output |
Airline Plugin Sync
When a plugin has"type": "airline", the VA platform manages distribution. Stratos automatically syncs the plugin set on authentication:
- Pilot logs in to their VA
- Shell fetches the airline’s public plugin list (every plugin the VA has installed for everyone, plus core plugins)
- After relay-token authentication, the shell fetches the pilot-scoped list — this returns the airline-wide plugins plus any extras the VA admin has assigned to that specific pilot
- Missing plugins are downloaded and installed automatically; removed plugins are cleaned up
- Updates are applied automatically when new versions are published
"user" type plugins, pilots install them manually.
CDN Layout
Plugin artifacts are stored at:latest.json Format
latest.json to detect available updates, verifies integrity via SHA256, and checks shell version compatibility before installing.