Skip to main content
This page takes you from an empty folder to a working plugin installed in Mission Control. No prior ADOS experience required.

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 in manifest.yaml. The GCS half is always TypeScript.

1. Get the SDK and templates

The plugin SDK and create-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 under extensions/:
The CLI lays out a minimal plugin:
The new 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

Open extensions/my-first-plugin/gcs/src/plugin.ts. The starter calls definePlugin from the SDK and shows a one-line greeting:
Change the text. Save.

4. Build

From the plugin folder:
This produces 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:
  1. Parsed your archive and showed a non-committing manifest preview.
  2. After your consent, unpacked the bundle to a per-user blob URL.
  3. Mounted an <iframe sandbox="allow-scripts"> and loaded your bundle inside it.
  4. Wired the postMessage bridge so your plugin can call back into the host.
  5. Recorded your plugin and its approved permissions so the install survives a reload.
For the deep tour, head to your first plugin.