Skip to content

Manifest

Every plugin ships a manifest.json. The loader validates it and the Plugin Store surfaces several fields in its UI.

{
  "id": "com.example.hello",
  "name": "Hello RBrowser",
  "version": "0.1.0",
  "apiVersion": "1",
  "minHostVersion": "0.1.0",
  "entry": "index.js",
  "permissions": ["state:read", "navigation:write", "highlight:write"],
  "panel": { "position": "right", "title": "Hello", "defaultWidth": 280 },
  "author": "Jane Doe",
  "description": "Says hello to the selected transcript.",
  "icon": "icon.png",
  "homepage": "https://github.com/you/hello-rbrowser"
}

Fields

Field Required Notes
id yes Stable unique id (reverse-DNS or kebab-case).
name yes Human-readable name.
version yes Plain semver. Used for upgrade-vs-downgrade detection.
apiVersion yes '1' — bumped on breaking SDK changes. The loader rejects unknown versions.
minHostVersion yes Lowest host semver this plugin works on.
entry yes Path / URL to the ESM bundle that default-exports a PluginModule.
permissions yes Array of Permission strings; shown to the user on install.
panel yes { position: 'left' \| 'middle' \| 'right', title?, defaultWidth? }
author no
description no One-line description shown in the store.
icon no Path inside the .rbp archive (typically icon.png).
homepage no URL to docs / source repo.

Type

The full contract, from @rbrowser/plugin-sdk:

interface PluginManifest {
  id: string
  name: string
  version: string
  apiVersion: '1'
  minHostVersion: string
  entry: string
  permissions: Permission[]
  panel: {
    position: 'left' | 'middle' | 'right'
    title?: string
    defaultWidth?: number
  }
  author?: string
  description?: string
  icon?: string
  homepage?: string
}

Once the manifest is ready, see Packaging & CLI to build a .rbp.