Plugin System

Create, load, and publish plugins that extend Floww's functionality.

Plugins are the primary extension mechanism in Floww. A plugin can register custom nodes, add UI panels, respond to workflow events, integrate with external services, or modify Floww's behavior in virtually any way the API permits.

Plugin Structure

A Floww plugin is a directory with a well-defined layout:

my-plugin/
  manifest.json       # Plugin metadata and configuration
  index.js            # Entry point (loaded by Floww)
  assets/             # Optional static assets (icons, images)
    icon.svg
  lib/                # Optional internal modules
    helpers.js
  README.md           # Optional documentation

At minimum, a plugin needs manifest.json and index.js. Everything else is optional.

The Plugin Manifest

The manifest.json file tells Floww about your plugin — what it's called, what permissions it needs, and where its code lives.

{
  "name": "floww-plugin-github",
  "version": "1.2.0",
  "displayName": "GitHub Integration",
  "description": "Adds GitHub nodes for issues, PRs, and repository management.",
  "author": {
    "name": "Your Name",
    "url": "https://github.com/yourname"
  },
  "license": "MIT",
  "entry": "index.js",
  "permissions": [
    "network",
    "variables:read",
    "nodes:register"
  ],
  "flowwVersion": ">=0.8.0",
  "repository": "https://github.com/yourname/floww-plugin-github"
}

Manifest fields

Field Required Description
nameYesUnique identifier. Must be lowercase, alphanumeric, hyphens only.
versionYesSemver version string.
displayNameNoHuman-readable name shown in the UI.
descriptionNoOne-line description.
authorNoObject with name and optional url.
licenseNoSPDX license identifier.
entryYesRelative path to the plugin's main JS file.
permissionsYesArray of permission strings (see below).
flowwVersionNoSemver range of compatible Floww versions.
repositoryNoURL to source repository.

Permissions

Plugins must explicitly declare the capabilities they need. Users are prompted to approve permissions when installing a plugin.

Permission Grants access to
networkMake HTTP/HTTPS requests from node execution
filesystem:readRead files from the local file system
filesystem:writeWrite files to the local file system
variables:readRead workflow variables
variables:writeCreate or modify workflow variables
nodes:registerRegister custom node types
ui:panelAdd custom UI panels to the interface
clipboardAccess the system clipboard
Principle of least privilege
Only request the permissions your plugin actually needs. Requesting filesystem:write when you only need network will reduce user trust and may cause your plugin to be flagged during the registry review process.

Lifecycle Hooks

Your plugin's entry file must export an object with lifecycle hook functions. Floww calls these at specific moments during the plugin's lifetime.

// index.js
module.exports = {
  /**
   * Called when the plugin is first loaded.
   * Use this to register nodes, set up event listeners,
   * and initialize state.
   */
  onLoad(floww) {
    console.log('Plugin loaded!');
    floww.events.on('workflow:started', this.handleStart);
  },

  /**
   * Called when the plugin is being unloaded.
   * Clean up listeners, close connections, free resources.
   */
  onUnload(floww) {
    floww.events.off('workflow:started', this.handleStart);
  },

  /**
   * Called when the plugin is activated after being disabled.
   * Re-register any dynamic features.
   */
  onActivate(floww) {
    console.log('Plugin activated');
  },

  /**
   * Called when the user disables the plugin (without uninstalling).
   * Temporarily remove features but preserve state.
   */
  onDeactivate(floww) {
    console.log('Plugin deactivated');
  },

  handleStart(event) {
    console.log(`Workflow "${event.workflowName}" started`);
  }
};
Hook When it fires Typical use
onLoad(floww)Plugin is first loaded at startup or installRegister nodes, subscribe to events, initialize
onUnload(floww)Plugin is being uninstalledClean up everything
onActivate(floww)Plugin is re-enabled after being disabledRe-register features
onDeactivate(floww)User disables the pluginRemove features, preserve state

Accessing the Floww API

Every lifecycle hook receives the floww API object. This is your gateway to all of Floww's capabilities. The API is organized into namespaces:

floww.canvas

Interact with the visual canvas — add nodes, pan, zoom, query positions.

// Add a node to the canvas at a specific position
const node = floww.canvas.addNode('http-request', { x: 200, y: 300 });

// Fit the viewport to show all nodes
floww.canvas.fitToView();

floww.nodes

Register, query, and interact with nodes.

// Register a custom node type
floww.nodes.register({
  type: 'github-issue',
  displayName: 'GitHub Issue',
  category: 'Integrations',
  inputs: [{ name: 'repo', type: 'string' }],
  outputs: [{ name: 'issues', type: 'array' }],
  execute: async (inputs, config, context) => {
    const response = await fetch(
      `https://api.github.com/repos/${inputs.repo}/issues`
    );
    return { issues: await response.json() };
  }
});

floww.events

Subscribe to and emit events across the system.

// Listen for any node execution error
floww.events.on('node:error', (event) => {
  console.error(`Node ${event.nodeId} failed:`, event.error.message);
});

// Emit a custom event for other plugins to consume
floww.events.emit('github:rate-limited', { retryAfter: 60 });
Full API reference
For complete method signatures and all available namespaces, see the API Reference.

Packaging

To distribute your plugin, package it as a .zip file with your plugin directory at the root:

floww-plugin-github.zip
  └── floww-plugin-github/
        ├── manifest.json
        ├── index.js
        └── assets/
              └── icon.svg

Versioning guidelines

  • Follow Semantic Versioning strictly.
  • Bump major when you change node port schemas (breaks existing workflows).
  • Bump minor when you add new nodes or features.
  • Bump patch for bug fixes and documentation changes.

Users can install plugins by opening the .zip file in Floww or by dropping the extracted directory into their plugins folder at ~/.floww/plugins/.

Publishing

The Floww community registry is the central place to share plugins with other users.

Submission process

  1. Prepare — ensure your plugin has a complete manifest.json, a descriptive README, and an icon.
  2. Test — run your plugin against the latest stable Floww release. Confirm all declared permissions are necessary.
  3. Submit — use the floww publish CLI command or submit via the registry web interface.
  4. Review — a community reviewer will check your plugin for security, quality, and policy compliance. This typically takes 1-3 business days.
  5. Published — once approved, your plugin appears in the in-app plugin browser and the registry website.
Registry policies
Plugins must not contain obfuscated code, must not exfiltrate user data, and must clearly document what permissions they use and why. See the full contributing guidelines for details.