Skip to main content
The panel imports your [ui] entry as an ES module and calls its exported register function with a per-plugin API object. The same object is also available globally as window.myrax[<plugin id>].
web/plugin.js
register may be async — the panel awaits it. If it throws, the panel shows a “Plugin failed” toast with the error message and keeps running.
A page renders through exactly one of: myrax.routes.add(route) takes the same object — use it for pages that should exist without a sidebar entry, then navigate to them yourself.

Icon formats

toast

Values are namespaced internally as plugin:<id>:<value> — pass either form.

styles

Stylesheets listed in the manifest load automatically; these are for dynamic cases:
Relative paths are served from /addons/{id}/ with the same ?v= cache busting as your entry. Everything you inject is tagged with data-myrax-plugin="<id>" and removed when the plugin is disabled.

layout

Shorthands over styles.inject for hiding panel chrome:

refresh

Talking to your backend

The browser never reaches your runtime directly — go through the panel’s authenticated proxy:
Same origin, same session cookie — no CORS, no extra auth.

Theme tokens

Plugin DOM lives inside the panel, so its CSS variables are yours: --bg, --panel, --panel-2, --text, --muted, --line and the rest. Build on them and both themes work without extra code.