This page takes you from an empty folder to a working plugin installed in Mission Control. No prior ADOS experience required.Documentation Index
Fetch the complete documentation index at: https://docs.altnautica.com/llms.txt
Use this file to discover all available pages before exploring further.
What you need
- Node.js 20+ and pnpm 9+.
- Python 3.11+ (used by
pack.sh). - A working Mission Control install (
>=0.6.0). - A working ADOS Drone Agent if you plan to ship the agent half
(
>=0.10.0); the rest of this page only needs the GCS half.
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 computes the SHA-256 of every asset, rewrites the
placeholders in manifest.yaml, and zips into
extensions/my-first-plugin/dist/com.example.my-first-plugin-0.1.0.adosplug.
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.
- Held your plugin’s capabilities in the operator’s Convex profile so they survive reload.