The plugin manifest
{ "id": "my-word-count", "name": "Word Count", "description": "Displays word and character count in the status bar", "version": "1.0.0", "author": "Your Name", "license": "MIT", "main": "dist/index.mjs", "engines": { "baram": ">=0.5.0" }, "trust": "sandboxed", "capabilities": ["editor:readonly", "events", "statusbar"], "contributions": { "statusBar": [{ "id": "count", "text": "— words" }] }, "keywords": ["word", "count", "statistics"], "repository": "https://github.com/user/my-word-count", "homepage": "https://example.com"}Required Fields
Section titled “Required Fields”| Field | Type | Description |
|---|---|---|
id |
string | Unique identifier. Lowercase letters, digits, hyphens only. |
name |
string | Human-readable display name |
description |
string | Short description |
version |
string | Semver version |
author |
string | Author name |
license |
string | SPDX license identifier |
main |
string | Entry point file, relative to the plugin directory (e.g. dist/index.mjs) |
engines.baram |
string | Minimum Baram version, written >=X.Y.Z — see Version floor |
capabilities |
string[] | Required permissions — see Capabilities |
Optional Fields
Section titled “Optional Fields”| Field | Type | Description |
|---|---|---|
contributions |
object | What the app draws for the plugin (commands, status-bar items, settings, right-click and slash items, a sandboxed plugin’s sidebar panels) and the code block languages the plugin draws — see Contributions |
dependencies |
string[] | Other plugin IDs this plugin depends on |
tiptapExtensions |
object[] | Tiptap extensions exported by this plugin — see Tiptap Extension plugins |
repository |
string | Source code URL |
homepage |
string | Documentation URL |
icon |
string | Emoji icon for the marketplace/dev-list |
keywords |
string[] | Search keywords |
Contributions
Section titled “Contributions”contributions is data: Baram reads it from the manifest and draws it itself — no plugin code
runs to put an item on screen.
| Key | Each entry | At most |
|---|---|---|
commands |
{ id, title, palette? } |
50 |
statusBar |
{ id, text, tooltip?, command? } |
5 |
settings |
a settings field | 16 |
menu |
{ id, command, title?, when? } |
5 |
slash |
{ id, command, title?, description? } |
10 |
codeBlocks |
{ lang } |
10 |
panels |
{ id, title, icon? } |
3 |
codeBlocks is the exception: it names the fenced languages your plugin draws itself, with
ctx.codeBlocks, and needs the codeblocks capability — see
Code block renderers.
panels is a sandboxed plugin’s sidebar panels and needs the sidebar capability: Baram draws each
panel’s button and header from the manifest, and the plugin sends the content — see
Sidebar panels.
menu adds items to the editor’s right-click menu, and slash adds items to the slash menu.
Each names one of your commands by its id and shows that command’s title, unless it has a
title of its own (1–64 characters). A slash item’s description is 1–120 characters. when
is either left out — the item shows regardless of the selection — or "selection", and then
the item shows only while text is selected. Neither appears in source mode.
{ "contributions": { "commands": [{ "id": "cite", "title": "Insert citation" }], "menu": [{ "id": "cite", "command": "cite", "when": "selection" }], "slash": [ { "id": "cite", "command": "cite", "description": "Insert a citation at the caret" } ] }}There is no field for a keyboard shortcut. While the plugin is on, its commands are listed
under Plugins in Settings > Keybindings with no key, for the user to assign one. A
trusted plugin also needs the commands capability and registers each declared command — see
Command palette and Tiptap extensions.
Version floor
Section titled “Version floor”engines.baram is the oldest Baram your plugin runs on, and it is enforced: Baram
refuses to install or update to a version whose floor it does not meet, and says which
version is needed. Getting it wrong is not cosmetic — declaring a floor higher than
necessary makes your plugin uninstallable for users who could have run it.
Write it as >=X.Y.Z, with all three numbers:
{ "engines": { "baram": ">=0.5.0" } }That is the only form both Baram and the publish workflow read. Anything else — ^0.5.0,
~0.5, 0.5.0, a two-bound range — is treated by the app as no floor stated, so it
silently stops protecting your users; the publish workflow rejects it outright, so a
first-party release never ships that way. A prerelease build (0.6.0-beta.1) does not
satisfy >=0.6.0, per semver.

