Skip to main content
This is part 1 of the Your First Plugin tutorial.

Scaffold the project

Use the Noxus CLI to create a new plugin:
pip install noxus-sdk
noxus plugin create --output-dir ./my-plugins
This creates the following structure:
my-plugin/
├── my_plugin/
│   └── __init__.py
├── pyproject.toml
└── manifest.json
Or create it manually. Start with pyproject.toml:
[build-system]
requires = ["setuptools>=67", "wheel"]
build-backend = "setuptools.build_meta"

[project]
name = "weather-plugin"
version = "0.1.0"
description = "A weather data plugin for Noxus"
dependencies = [
  "noxus-sdk>=0.1.0",
  "httpx>=0.27.0",
]

Define the plugin class

Create weather_plugin/__init__.py:
from noxus_sdk.plugins import BasePlugin, PluginConfiguration
from noxus_sdk.plugins.types import PluginCategory


class WeatherPluginConfig(PluginConfiguration):
    """Plugin-level configuration — empty for now."""
    pass


class WeatherPlugin(BasePlugin[WeatherPluginConfig]):
    name = "weather-plugin"
    display_name = "Weather Plugin"
    version = "0.1.0"
    description = "Provides weather data nodes and integrations"
    category = PluginCategory.GENERAL
    author = "Your Name"

    def nodes(self):
        return []  # We'll add nodes in the next section

    def integrations(self):
        return []  # We'll add integrations later
Every plugin needs:
FieldDescription
nameUnique identifier (used for lookups and storage)
display_nameHuman-readable name shown in the UI
versionSemantic version string (e.g. "0.1.0")
descriptionShort description of what the plugin does
categoryOne of GENERAL, DOCUMENT, or OTHER
authorAuthor name
The nodes() and integrations() methods return lists of classes your plugin provides. We’ll populate them in the next sections.

Validate the structure

noxus plugin validate --path ./weather-plugin
The validate command checks your plugin class, generates the manifest, and reports any issues. Run it often as you develop.

Run locally

noxus plugin serve --path ./weather-plugin
This starts a local FastAPI server. You’ll see output like:
PLUGIN_PORT:8505
INFO:     Started server process
INFO:     Waiting for application startup
INFO:     Application startup complete
Visit http://localhost:8505/health to verify it’s running. The plugin won’t do much yet — let’s add a node.

Next: First Node →

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