Skip to main content
This is part 1 of the Your First Plugin tutorial.
A plugin is an installable Python package that adds nodes, integrations, triggers, and datasources to the platform. At install time the platform reads the plugin’s manifest (derived from your code — never hand-written), provisions a sandbox, and runs your plugin as a warm worker. The plugin class is the entry point that ties everything together.

Scaffold the project

Use the Noxus CLI to generate a plugin from the template:
create is interactive — it prompts for a few values and expands a template:
This produces the following structure (package names are derived from plugin_name):
There is no manifest.json in the scaffold. The manifest is generated from your code — see Generate the manifest below. Never write or edit it by hand.
Prefer to start from scratch? A plugin only needs a package with your plugin class plus a pyproject.toml. Here’s a minimal pyproject.toml:
Keep noxus-sdk at or above the platform’s version. The sandbox resolves noxus-sdk alongside your dependencies; pinning an older floor can make the worker fail to start.

Define the plugin class

Open weather_plugin/__init__.py. A plugin subclasses BasePlugin[YourConfig] and returns the components it provides from nodes(), integrations(), triggers(), and datasources():
Every plugin defines this metadata: The four provider methods return lists of classes your plugin exposes. A plugin must provide at least one node, integration, trigger, or datasource: We’ll populate nodes() in the next section.

Validate the structure

validate imports your plugin class, generates the manifest in memory, and reports any errors or warnings. Run it often as you develop. Add --strict to make warnings fail too.

Generate the manifest

The manifest is the install-time contract, derived entirely from your code. Generate manifest.json with:
Regenerate it whenever a node, trigger, integration, or config signature changes. When you’re ready to ship, noxus plugin package --path ./weather-plugin bundles the source and a fresh manifest into an archive you upload via the platform’s Add plugin flow.

Run locally

For a quick local authoring loop, serve the plugin over HTTP:
You’ll see output like:
Visit http://localhost:8505/health to verify it’s running, or http://localhost:8505/manifest to inspect the generated manifest.
serve is a local authoring aid. On the platform, plugins don’t run as an HTTP server — they run as sandboxed JSON-RPC workers, and file operations (reading or writing platform files) are only available there, not under serve. Use serve to iterate on node logic that doesn’t touch platform files; use the install flow to exercise the full runtime.
The plugin won’t do much yet — let’s add a node.

Next: First Node →

Create your first node with bindable inputs, typed outputs, and logic.