> ## 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.

# Quickstart

> Scaffold and install your first plugin in five minutes.

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`](https://github.com/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.

```sh theme={"theme":{"light":"github-light","dark":"github-dark"}}
git clone https://github.com/altnautica/ADOSExtensions.git
cd ADOSExtensions
pnpm install
```

## 2. Scaffold

Run the scaffolder against a new folder under `extensions/`:

```sh theme={"theme":{"light":"github-light","dark":"github-dark"}}
node packages/create-ados-plugin/bin/cli.mjs \
  --target extensions/my-first-plugin \
  --id com.example.my-first-plugin \
  --half gcs-only \
  --author "Your Name"
```

The CLI lays out a minimal plugin:

```
extensions/my-first-plugin/
├── package.json
├── manifest.yaml
├── README.md
├── locales/en.json
└── gcs/
    ├── package.json
    ├── tsconfig.json
    └── src/plugin.ts
```

The new `gcs/package.json` declares `@altnautica/plugin-sdk` as a
`workspace:^` dependency so pnpm wires it directly to the in-tree
package.

```sh theme={"theme":{"light":"github-light","dark":"github-dark"}}
pnpm install
```

## 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:

```ts theme={"theme":{"light":"github-light","dark":"github-dark"}}
import { definePlugin } from "@altnautica/plugin-sdk";

definePlugin({
  id: "com.example.my-first-plugin",
  version: "0.1.0",
  async mount(ctx) {
    document.body.textContent = "Hello from a plugin";
  },
});
```

Change the text. Save.

## 4. Build

From the plugin folder:

```sh theme={"theme":{"light":"github-light","dark":"github-dark"}}
cd extensions/my-first-plugin
pnpm build
```

This produces `gcs/plugin.bundle.js`. The build is plain esbuild;
no React or Vite required.

## 5. Pack

From the monorepo root:

```sh theme={"theme":{"light":"github-light","dark":"github-dark"}}
./scripts/pack.sh my-first-plugin
```

`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](/developers/your-first-plugin).
