Plugin SDK · build for QuoxCORE
Quox Plugin SDK.
Build, test and distribute third-party plugins for QuoxCORE. Four packages on npm (@quoxai scope, version 0.4.1), source on GitHub under the Apache 2.0 licence. No marketplace listing flow yet.
In plain words
What it is, where it lives, when to reach for it
- What is it
- A software development kit for building plugins that install into the QuoxCORE dashboard.
- Where do I use it
- On your own development machine, in any Node.js project, with your usual editor.
- When would I use it
- When QuoxCORE needs a view or capability it does not ship with, and you can build it.
- How do I use it
- Run
npx @quoxai/create-quox-plugin my-plugin, then build, sign and install it withquox plugin installor the dashboard.
QuoxCORE is the free, self-hosted platform underneath this. What is QuoxCORE
How it works
Four steps from idea to installed plugin.
Scaffold, build, package, install. No manual wiring required.
npx @quoxai/create-quox-plugin my-plugin generates a project from one of 8 templates, with manifest, entry point and a dev preview.npm run build writes dist/plugin.esm.js and dist/plugin.css; npm run validate checks them.npx quox-plugin keygen --out .keys once, then npm run sign writes dist/signature.json.quox plugin install. An org admin trusts your public key with quox plugin trusted-keys add.What you can build
Extend QuoxCORE in six directions.
Plugins can add UI, storage, notifications and an agent sidebar today. Backends run on managed Quox instances; self-hosted installs do not run them yet.
Sidebar views
/plugins/ automatically.Your own backend
Ship a container image with your plugin and the frame reaches it through quox.fetch under your plugin namespace. On managed Quox instances it runs on its own network with a per-plugin credential (never the instance key): every request carries a signed ticket for the caller's organisation, and the backend can reach the gateway and the public internet but not your LAN, the host or other plugins. Self-hosted installs from the public release do not run plugin backends yet.', perm: 'network
Your own agent
Declare an agent in your manifest (name, role, color, systemPrompt, suggestions) and Quox renders the agent sidebar next to your plugin, the same component its own agents like NotesQ use. A community agent has no tools: its persona is untrusted text and cannot grant tools, data access or delegation.
Memory and evidence (not yet)
window.quox.memory and window.quox.aee exist but are refused with not_available for community plugins, because there is no plugin memory or evidence route yet. Agent tools are for official plugins only.
Notifications
Show toast notifications to users from plugin actions. Success, warning, error and info variants.
Plugin storage
Server-backed key/value storage namespaced to your plugin, enforced fail-closed in the sandbox like notifications and network.
Four packages
Everything you need, nothing you do not.
Each package has a single responsibility. Use them together or individually.
@quoxai/create-quox-plugin
Scaffolder
Project generator with 8 templates (basic, monitoring-dashboard, fleet-management, service-bridge, ui-feature, enterprise-extension, specialist-agent, agentic-team). Can also scaffold a specialist-agent plugin from an MCP server.
@quoxai/quox-plugin-sdk
Runtime and types
TypeScript types, registerPlugin and getQuox() for window.quox, plus a mock window.quox for tests.
@quoxai/quox-plugin-vite
Build tooling and CLI
Vite plugin that externalises shared deps, bundles the qx CSS, runs the sandbox dev preview, and ships the quox-plugin CLI (validate, keygen, sign).
@quoxai/eslint-plugin
Lint rules
Flags code the sandbox will not allow: host-only globals and browser storage used as the primary store.
Source: github.com/quoxai/quox-plugin-sdk, Apache 2.0 licence. The packages are unscoped on npm, not under @quoxai or @quox.
Architecture
What you build and install.
The build writes a bundle and a stylesheet; your manifest stays at the project root. QuoxCORE runs the bundle in a sandboxed frame and registers its routes and sidebar entries.
manifest.json: plugin metadata, permissions, sidebar configdist/plugin.esm.js: compiled ESM bundle, React externaliseddist/plugin.css: your styles plus the bundled qx design-system CSSdist/signature.json: Ed25519 signature overplugin.esm.js
my-plugin/ ├── manifest.json └── dist/ ├── plugin.esm.js ├── plugin.css └── signature.json
// QuoxCORE provides these globally: window.__quoxSharedDeps = { React, ReactDOM, ReactRouter }; // Your plugin imports work normally. // The Vite plugin rewrites them // at build time.
Where your plugin fits
Four kinds of add-on, clearly labelled.
Quox has four kinds of add-on, and no one should have to guess which is which. Plugins you build with this SDK are Community plugins, credited to you and labelled unverified unless the installing org trusts your key.
Core
Ships inside every QuoxCORE install. Always present, no purchase, and it cannot be removed. QuoxCORE itself is the platform runtime these run on, not a plugin.
Installable
Added from the marketplace when you want it. Some are free, some unlock with a licence key. Non-core, toggle on and off.
Quox-installable
Quox-made, but a genuine install: a daemon, service or desktop app you set up, not a one-click key unlock.
Community
Built by an outside developer and credited to its author. Runs in an isolated sandbox. The marketplace catalogue is not open yet, so today you install it on your own instance.
Listing and selling are not open yet. There is no marketplace submission flow for community plugins today. Developer path
Security
Signed, scoped and sandboxed.
Community plugins run in an isolated frame with explicit permissions.
Ed25519 signing
An org admin registers the Ed25519 public keys of the authors it trusts. Once an org has a trusted key, QuoxCORE accepts only bundles carrying a valid signature from one of them.
- Generate a key pair with
npx quox-plugin keygen - Sign with
npm run signafter every build - The signature covers
plugin.esm.jsonly - A modified bundle fails with
digest_mismatch
Permission model and sandbox
The plugin runs in an iframe with sandbox="allow-scripts", an opaque origin and connect-src 'none'. It cannot make network requests, read the host page or touch other plugins. Everything goes through window.quox.
- Seven permissions, declared in the manifest and reviewed at install
- No host components, contexts or stylesheets inside the frame
- Storage is namespaced to your plugin
- Backend calls are confined to your plugin namespace; absolute URLs and traversal are refused
- Storage, network and notifications are enforced fail-closed; memory and aee are refused as not available
- quox.fetch reaches your backend only on instances that run plugin backends (managed Quox today)
Add items to the sidebar navigation.
Server-backed key/value storage scoped to your plugin.
Enforced. Call your plugin backend through quox.fetch, where the instance runs plugin backends.
Not available. Refused with not_available for community plugins.
Show toast notifications.
Not available. Refused with not_available for community plugins.
Official plugins only. Community plugins cannot register tools.
Plugin API
One object, a small surface.
Plugins reach QuoxCORE through window.quox, a promise-based API bridged to the host over postMessage. Get it with getQuox(). If an API is not on the list, it does not exist for a community plugin.
Every call can fail, so render the error. The host refuses a call the manifest does not have permission for.
- storage: server-backed, namespaced to your plugin ID
- fetch: relative paths to your own backend namespace
- memory and aee: present, refused with not_available for community plugins
- navigate, notify, getUser and onEvent
import { getQuox } from '@quoxai/quox-plugin-sdk'; async function runScan() { const quox = getQuox(); // Storage await quox.storage.set('lastRun', Date.now()); // Your backend (coming for community plugins) const res = await quox.fetch('status'); if (!res.ok) return; // Notifications await quox.notify('Scan complete', 'success'); }
Where it stands
What's proven, what's still beta.
The SDK is published at 0.4.1. This is what is solid, what is partial, and what does not exist yet.
- Four packages are published to npm under the @quoxai scope, at version 0.4.1, each with npm provenance from GitHub Actions, and the repo is public under the Apache 2.0 licence
- A clean install from the public registry scaffolds, builds, validates and signs all eight templates
- The scaffold, build, validate, sign and install flow is the documented path, and npm run dev simulates the same sandbox locally
- Community plugins run in an opaque-origin iframe with no direct network and talk to Quox only through window.quox
- Ed25519 signing is real and binds the manifest, the bundle and the stylesheet: once an org has trusted keys, only packages with a valid signature from one of them install, and an org admin can revoke a key or a package
- The dev preview is an approximation, not a QuoxCORE instance: confirm storage and notifications by installing the built plugin
- Community plugin backends run only on managed Quox instances, and only with a signature v2 from a trusted, unrevoked key and a digest-pinned image; self-hosted installs from the public release do not run plugin backends yet
- A running backend is fenced to the gateway and the public internet; the fence is reapplied when the instance starts, but a full host reboot has not been tested, and plugin networks are IPv4 only
- window.quox.memory and window.quox.aee are refused with not_available for community plugins; agent tools from a backend load for official plugins only
- There is no marketplace submission or listing flow yet: the catalogue is not open to community plugins
- Revocation is per organisation: there is no key expiry, rotation endpoint or revocation list shared between instances
- Official, first-party Quox plugins are a separate path with a wider surface and are not built with this SDK
- The SDK is version 0.4.1: expect the API surface to keep moving
Get started
From scaffold to installed.
Scaffold a new plugin, install dependencies and start the dev preview. Then build, validate, sign and install. These commands run from the public npm packages.
# Scaffold a new plugin project npx @quoxai/create-quox-plugin my-plugin # Install dependencies cd my-plugin npm install # Start the dev server npm run dev
# Build and check the bundle npm run build npm run validate # Generate a signing key (once) npx quox-plugin keygen --out .keys # Sign the bundle npm run sign # Install (org admin) quox plugin install \ --manifest manifest.json \ --bundle dist/plugin.esm.js \ --css dist/plugin.css \ --signature dist/signature.json
Or install from the dashboard plugins page. An org admin trusts your public key first with quox plugin trusted-keys add --label <l> --public-key <hex>. Source on GitHub, Apache 2.0.
Start building
Your plugin, on every QuoxCORE.
The SDK is on npm and the source is public. Read the docs, then scaffold your first plugin.
Go deeper