Build an external plugin from the maintained Kanban starter. Follow its setup and install guide. Its manifest uses published dependencies and can run outside this monorepo.
The Notes example includes a React UI, a Pi extension, shared state, a
background runtime, and a dashboard widget. It uses workspace: and catalog:
dependencies and is for development in the Sero monorepo unless you port its
complete manifest to published dependencies:
The example is for a plugin inside the Sero monorepo:
For a separate repository, start with Kanban. Use Notes only when you need its
additional surfaces. At the time of this documentation, @sero-ai/app-runtime
is 0.4.0 and @sero-ai/plugin-vite is 0.1.1. Check the npm registry before
you select versions for a new plugin.
Copy sero-notes-plugin to plugins/sero-<name>-plugin/. Then change:
sero.app.id, name, icon, and stateFile;vite.config.ts to sero_<id>;devPort in package.json and server.port in vite.config.ts.Keep the port values equal. Use a port that no other plugin uses.
Keep extension/ for Pi tools and commands. Keep ui/ and vite.config.ts for
a visual app. Keep runtime/ only for long-running work, such as watchers or
recovery.
If the plugin has a federated UI, keep these contracts:
sero.plugin.runtimeAbi to 2;sero.app.styleIsolation to "scope";seroPluginCssScope({ pluginId: '<id>' }) from
@sero-ai/plugin-vite after Tailwind;@sero-ai/ui/styles/plugin.css in ui/styles.css;./<Component> in Vite, but put <Component> in the manifest;base: './' for production builds.Sero rejects a federated UI when its runtime ABI is absent or does not equal the host ABI. Extension-only plugins do not need this ABI value.
When you remove a UI or runtime surface, remove all of its contracts:
ui, component, runtime, devPort,
and widgets;appRuntime.background;Run the remaining typecheck and build scripts after each removal.
From the monorepo root, run:
For an installable bundle, also run:
Open Admin → Plugins → Local Plugin Development. Select the plugin source
folder and start the session. Sero reads scripts.dev, starts that command on
the host, and checks http://127.0.0.1:<devPort>/mf-manifest.json or the
equivalent localhost URL. Do not start a second server on the same port.
If the live UI cannot start, Sero uses dist/ui when a built UI is available.
Changes to the UI refresh the plugin surface. Changes to the extension, runtime,
shared types, resources, or manifest refresh the development session and can
reload plugin resources.
Confirm that: