Overview
An extension package is a single Git repository that contains multiple extensions — for example, an integration, a plugin, and a widget that work together. This is the recommended approach when your extensions are tightly coupled (e.g., a Notion integration + Notion plugin + Notion widget).Manifest format
Create aradarboard-extension.json file at the root of your repo:
radarboard-extension.json
Fields
Extension entry fields
Repository structure
Scaffolding
Use the scaffold tool to generate a starter extension repo:radarboard-extension.jsonmanifestpackage.jsonfiles for each extension with correct SDK dependencies- Starter TypeScript code with descriptor exports and capability stubs where relevant
biome.json,tsconfig.json,.gitignore- README with installation instructions
Capability-aware packaging
When an extension package contains both an integration and a widget for the same product area, keep the ownership model explicit:- Integrations should declare
capabilitiesfor the shared surfaces they provide. - Widgets should declare
capabilitiesfor the surfaces they own, usingrole: "canonical"orrole: "specialized". requiredIntegrationsstill helps with availability filtering, but capability ownership is what Radarboard uses for canonical widget governance.
Installation
When a user installs from a GitHub URL, Radarboard:- Checks for
radarboard-extension.jsonin the repo - If found, validates each declared extension
- Clones the repo and extracts each extension to its correct directory (
integrations/,plugins/,widgets/) - Updates
radarboard.config.tswith all extensions - Runs
pnpm generate:extensionsandpnpm install
package.json name prefix).
Validation
Each extension in the package is validated independently:- Package name matches the manifest entry
- Required SDK dependency is present (
integration-sdk,plugin-sdk, orwidget-sdk) - Export map has a
.(default) entry - No cross-extension imports (widget importing plugin code, etc.)
- No forbidden workspace dependencies