What you need
- Node.js 20+ and pnpm 9+.
- Python 3.11+ only if you sign archives (
scripts/sign.sh); the quickstart packs an unsigned archive and installs it in developer mode, so it is optional here. - A working Mission Control install.
- A working ADOS Drone Agent if you plan to ship the agent half; the
rest of this page only needs the GCS half. The agent half can be
written in Python (
runtime: python, the scaffolder default) or Rust (runtime: rust), set inmanifest.yaml. The GCS half is always TypeScript.
1. Get the SDK and templates
The plugin SDK andcreate-ados-plugin scaffolder live in the
altnautica/ADOSExtensions
monorepo. The standalone @altnautica/plugin-sdk npm publish lands
with the hosted registry; until then the supported workflow is to
clone the monorepo and develop your plugin alongside it as a pnpm
workspace member.
2. Scaffold
Run the scaffolder against a new folder underextensions/:
gcs/package.json declares @altnautica/plugin-sdk as a
workspace:^ dependency so pnpm wires it directly to the in-tree
package.
3. Edit the plugin
Openextensions/my-first-plugin/gcs/src/plugin.ts. The starter
calls definePlugin from the SDK and shows a one-line greeting:
4. Build
From the plugin folder:gcs/plugin.bundle.js. The build is plain esbuild;
no React or Vite required.
5. Pack
From the monorepo root:pack.sh builds the GCS bundle and zips the plugin tree into
extensions/my-first-plugin/dist/com.example.my-first-plugin-0.1.0.adosplug.
Signing is a separate step (scripts/sign.sh): it computes the
canonical payload hash and writes the SIGNATURE file.
6. Install
Open Mission Control. Go to Settings -> Plugins and click Install plugin. Drag the.adosplug into the dialog, review the
manifest preview, approve the requested permissions, and click
Install.
The plugin mounts in the FC tab.
What just happened
The host:- Parsed your archive and showed a non-committing manifest preview.
- After your consent, unpacked the bundle to a per-user blob URL.
- Mounted an
<iframe sandbox="allow-scripts">and loaded your bundle inside it. - Wired the postMessage bridge so your plugin can call back into the host.
- Recorded your plugin and its approved permissions so the install survives a reload.