Kwirth Plugins

Plugins extend Kwirth with new UI channels and backend capabilities — all hot-reloadable without restarting the container. Build once, install anywhere.

What is a plugin?

A Kwirth plugin is a self-contained bundle that adds a new channel tab to the Kwirth front-end and, optionally, a backend component that runs alongside Kwirth's core. Plugins follow the same lifecycle as built-in channels: the user selects a cluster, opens a tab, and the plugin takes over rendering and data fetching.

Plugins are packaged as a .tgz file containing a CJS backend bundle (back.js), an IIFE frontend bundle (front.js), and a package.json manifest. Once installed, Kwirth hot-reloads them — no container restart required.

Browser → Kwirth front → loads front.js (IIFE, registers on window.__kwirth_plugins__)
Kwirth back → loads back.js (CJS, registers IPlugin / IChannel)
Plugin → receives ClusterInfo, WebSocket session, senders, providers

Autonomous plugins

Not every plugin observes cluster resources. An autonomous plugin needs nothing from the cluster — no namespace, pod or container — so it opens directly, without asking the user to pick a scope. It is a regular plugin in every other respect.

This is what lets you embed a standalone JavaScript application — a game, a dashboard, a small tool, an external widget — as a Kwirth channel, and have it inherit the framework's services for free: authentication, RBAC, persistence (ConfigMaps / Secrets / PVC / files), the real-time WebSocket, providers, theming and notifications. Build the app once; ship it as a channel and let Kwirth handle sign-in, permissions and state.

A plugin declares itself autonomous by setting cluster: false and resourced: false in its back-channel data — its only view becomes none, and Kwirth starts it once with no resource selection.

Pluviders: a plugin that also publishes

Some plugins run a back end of their own, always started, that produces genuinely valuable information — proactive alerts raised after investigating an incident, log messages already filtered down to what matters, an enriched picture of external traffic. Until now that information could only reach one place: that plugin's own front end.

A pluvider is a plugin that also publishes what it produces in-process, so any other plugin in the same Kwirth can subscribe to it — exactly the way channels already subscribe to the events or metrics providers. It is not a provider packaged next to a plugin: it is the same class, the same instance and the same information, reaching one more door.

Producers are addressed with a plugin: prefix (plugin:agora) and consumed with no new API at all — a channel subscribes to a pluvider exactly as it subscribes to a provider. The dependency is soft: if the producing plugin is not installed, the consumer still starts and still works.

Available plugins

🔧

Ops

Day-to-day cluster operations from the browser: interactive shell sessions (XTERM), pod and namespace restarts, one-shot command execution, and object inspection — no kubectl needed.

Available
🛡️

Trivy Security Scanner

Container image vulnerability scanning via Trivy operator integration. CVE details, SBOM, audit checks, and exposed secrets in a unified view.

Available
🤖

Pinocchio AI

Autonomous AI agent for cluster analysis. Watches Kubernetes events and business data, runs configurable LLM triggers, and streams findings with severity levels in real time.

Available
🚫

Censor

LLM-based log noise filter. Batches log lines, sends them to an LLM to learn regex patterns, then applies those patterns in-process — so only meaningful lines reach the screen.

Available
🌍

Topology

Interactive 3D graph of your live Kubernetes cluster. Nodes represent workloads, services, ingresses, and PVCs; edges show ownership and routing. Updates in real time via Kubernetes events.

Available
📰

News

RSS feed reader for Kubernetes and AI news. Polls external feeds on a timer, deduplicates items, and streams new articles to the tab. Also serves as a reference for plugins that pull from external HTTP sources.

Dev / Reference
📡

Echo

Reference plugin and development scaffold. A minimal working plugin with both frontend and backend components — use it as a starting point for your own plugin.

Dev / Reference
📂

Fileman

Visual filesystem explorer for all Kubernetes containers. Navigate, copy, move, rename, delete, download, and upload files across any container — including cross-container copy/move operations.

Available
📜

Log

Real-time log streaming from any container, pod or whole namespace, merged into one colour-coded live view with filtering, regex search and per-source names.

Available
📊

Metrics

Live CPU / memory / network / I/O charts for any set of objects, straight from cAdvisor/kubelet — no Prometheus. Multiple chart types, aggregate or merge.

Built-in
🔔

Alert

Rule-based alerting on log patterns and metric thresholds. Detection runs server-side; alerts are colour-coded by severity and can be routed to a sender.

Available
🔍

Magnify

Full Kubernetes explorer & manager (Lens/K9s-style) — browse, edit and operate every object, with cross-artifact search. Also ships as a standalone desktop app.

Built-in
💬

mIRC

Cross-cluster direct messaging between connected users — WhatsApp-style delivery ticks and an offline mailbox that delivers on reconnect.

Available
🐞

Provider Debug

Diagnostic channel that subscribes to a running provider and streams its raw events into a tab — inspect exactly what a provider emits while building or troubleshooting.

Dev / Reference
📤

Sender Debug

The outbound twin of Provider Debug: pick a sender and one of its configurations, write a message by hand and read what the sender actually answered — a real send, because a dry run proves nothing.

Dev / Reference
📝

Audit Logger

Structured audit trail for all Kwirth user actions — API key usage, config changes, plugin installs — exportable as JSON or forwarded via senders.

Planned
⚙️

Your Plugin

Any new observability mode, management tool, or integration you can imagine. The plugin API gives you full access to cluster state, WebSocket sessions, and the sender subsystem.

Build your own

Plugin interface

Every backend plugin must implement the IPlugin interface exported from @kwirthmagnify/kwirth-common-back:

id: stringUnique identifier (e.g. "trivy", "pinocchio")
getChannel(clusterInfo)Returns an IChannel instance that handles a specific cluster connection
startPlugin(context)Called once at startup — receive senders, providers, and cluster context
stopPlugin()Called on graceful shutdown
getConfigSchema?()Optional — returns field definitions so the UI can render a config form

Build your own plugin

Plugins follow a simple project structure. The backend compiles to CJS (dist/back.js), the frontend to an IIFE (dist/front.js) that registers on window.__kwirth_plugins__. Both are bundled with esbuild.

plugins/my-plugin/
  src/
    back/index.ts     ← implements IPlugin
    front/index.tsx   ← registers on window.__kwirth_plugins__['my-plugin']
  build.mjs           ← esbuild script
  package.json        ← includes id, displayName, version, description

The frontend bundle receives backendUrl and accessString as props so it can make authenticated API calls without importing from Kwirth core:

// src/front/index.tsx
import MyPluginPanel from './MyPluginPanel'
window.__kwirth_plugins__ = window.__kwirth_plugins__ ?? {}
window.__kwirth_plugins__['my-plugin'] = MyPluginPanel

// Props your component receives:
// { backendUrl: string, accessString: string, clusterName: string }

See the echo plugin in plugins/echo/ for a complete working example, and the full API reference in the developer docs.

Ready to build a plugin?

The full plugin API reference, lifecycle documentation, and development guide are in the Kwirth docs.

Developer docs → Echo plugin source