Registry

Add a plugin. Skip the compile.

Lumen's plugin system is crates that register systems into the runtime. The registry distributes them prebuilt: publish once, and anyone pulls your plugin as a ready-to-load library — no full source build.

prebuilt

Plugin dylibs

Publish a compiled plugin once; others load it into an app without pulling your source or waiting on a first-run build.

one command

lumenc add

The index maps a plugin name to its location, so adding a dependency is a single command instead of a manual wire-up.

scoped power

Capability manifests

A manifest lets an app opt a plugin out of specific powers — network, filesystem — before it loads.

How it fits. The registry distributes the same plugin trait the shipped tooltip and drag primitives are built on — settled, stable, and already running inside every Lumen app. Nothing here changes how you write markup or script.
Under the hood

What a plugin looks like

A plugin implements one trait and registers its systems. The registry distributes exactly this — prebuilt, so you don't compile it yourself.

my_plugin.rs
pub struct MyPlugin;

impl Plugin for MyPlugin {
    fn build(self, app: &mut App) {
        app.world.insert_resource(MyConfig::default());
        app.add_systems(
            TickStage::Systems,
            my_tick_system,
        );
    }
}
terminal
# pull a prebuilt plugin into your app
$ lumenc add lumen-charts

# it loads on the next run — no rebuild,
# no cargo, no waiting on a compile
Publish yours

Share a plugin.

The public plugin API is stable. Build against the trait and publish — the primitives Lumen ships are plugins themselves.

Read the source →
# the shipped primitives are plugins too lumen/primitives/ ├── tooltip.rs # TooltipPlugin ├── drag.rs # DragPlugin └── transition.rs