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
| Field | Type | Description |
|---|---|---|
name | string | Human-readable package name |
description | string | What this package provides |
author | object | { name, url } of the author |
minAppVersion | string | Minimum Radarboard version required |
extensions | array | List of extensions in this repo |
Extension entry fields
| Field | Type | Description |
|---|---|---|
type | "integration" | "plugin" | "widget" | Extension category |
path | string | Relative path from repo root to the extension directory |
name | string | Package name (must match the name in the extension’s package.json) |
required | boolean | If true, validation fails when this extension has errors |
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
biome.json,tsconfig.json,.gitignore- README with installation instructions
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
Dependency rules
Each extension type has allowed workspace dependencies:| Extension type | Allowed @radarboard/* deps |
|---|---|
| Integration | integration-sdk, types, utils |
| Plugin | plugin-sdk, types, utils, ui, widget-engine, embedding-service, llm |
| Widget | widget-sdk, widget-engine, types, utils, ui, charts, hooks, assistant-ui |