Skip to content

manifest.json v2.4 Schema

The manifest.json file is the central configuration for your BoardAPI component. It defines metadata, behavior, permissions, and integration points.

Schema Version

json
{
  "$schema": "https://boardapi.io/schemas/manifest-v2.4.json"
}

Basic Information

Required Fields

FieldTypeDescription
namestringUnique component identifier (lowercase, alphanumeric, hyphens)
versionstringSemantic version (e.g., 1.0.0)
titlestringDisplay name for users
descriptionstringBrief description of component functionality

Optional Metadata

FieldTypeDescription
authorstringAuthor name and email (e.g., "John Doe <john@example.com>")
licensestringLicense identifier (e.g., "MIT")
repositorystringGit repository URL
keywordsstring[]Search keywords for marketplace

Example:

json
{
  "name": "countdown-timer",
  "version": "1.2.3",
  "title": "Countdown Timer",
  "description": "Interactive countdown timer with alerts",
  "author": "John Doe <john@example.com>",
  "license": "MIT",
  "repository": "https://github.com/johndoe/countdown-timer",
  "keywords": ["timer", "countdown", "productivity"]
}

Entry Points

FieldTypeRequiredDescription
entrystringYesMain JavaScript file (e.g., "component.js")
stylesstringNoMain CSS file (e.g., "styles.css")

Example:

json
{
  "entry": "component.js",
  "styles": "styles.css"
}

Dimensions

Configure component size and resizing behavior.

FieldTypeDefaultDescription
widthnumber300Initial width in pixels
heightnumber200Initial height in pixels
minWidthnumber200Minimum width
minHeightnumber150Minimum height
maxWidthnumber-Maximum width (optional)
maxHeightnumber-Maximum height (optional)
resizablebooleantrueAllow resizing
aspectRatiostringnullLock aspect ratio: "16:9", "4:3", or null

Example:

json
{
  "dimensions": {
    "width": 400,
    "height": 300,
    "minWidth": 300,
    "minHeight": 200,
    "maxWidth": 1000,
    "maxHeight": 800,
    "resizable": true,
    "aspectRatio": "16:9"
  }
}

Props (Configuration)

Props are configurable values set by the host application. They generate a settings UI automatically.

Prop Schema

Each prop has:

FieldTypeRequiredDescription
typestringYesData type: string, number, boolean, array, object
defaultanyYesDefault value
descriptionstringNoDocumentation
uiobjectNoUI widget configuration

UI Widget Types

WidgetTypeDescription
textstringSingle-line text input
textareastringMulti-line text input
richtextstringRich text editor
numbernumberNumber input
slidernumberRange slider (with minimum/maximum)
steppernumberIncrement/decrement buttons
radiostringRadio buttons (with enum)
selectstringDropdown select (with enum)
buttonsstringButton group (with enum)
colorstringColor picker
color-arraystring[]Multiple color pickers

Examples

String Props:

json
{
  "props": {
    "title": {
      "type": "string",
      "default": "My Timer",
      "description": "Component title",
      "ui": {
        "label": "Title",
        "placeholder": "Enter title...",
        "widget": "text"
      }
    },
    "description": {
      "type": "string",
      "default": "",
      "ui": {
        "label": "Description",
        "widget": "textarea"
      }
    }
  }
}

Number Props:

json
{
  "props": {
    "duration": {
      "type": "number",
      "default": 300,
      "minimum": 0,
      "maximum": 3600,
      "ui": {
        "label": "Duration (seconds)",
        "widget": "slider"
      }
    },
    "fontSize": {
      "type": "number",
      "default": 16,
      "minimum": 12,
      "maximum": 48,
      "ui": {
        "label": "Font Size",
        "widget": "stepper"
      }
    }
  }
}

Enum Props:

json
{
  "props": {
    "theme": {
      "type": "string",
      "enum": ["light", "dark", "auto"],
      "default": "auto",
      "ui": {
        "label": "Theme",
        "widget": "radio"
      }
    },
    "layout": {
      "type": "string",
      "enum": ["horizontal", "vertical", "grid"],
      "default": "horizontal",
      "ui": {
        "label": "Layout",
        "widget": "select"
      }
    }
  }
}

Boolean Props:

json
{
  "props": {
    "showSeconds": {
      "type": "boolean",
      "default": true,
      "ui": {
        "label": "Show seconds"
      }
    }
  }
}

Array Props:

json
{
  "props": {
    "colors": {
      "type": "array",
      "items": { "type": "string", "format": "color" },
      "default": ["#FF0000", "#00FF00", "#0000FF"],
      "ui": {
        "label": "Color palette",
        "widget": "color-array"
      }
    }
  }
}

Storage (Shared State)

Define the schema for real-time synchronized data.

Schema Definition

Each storage key has:

FieldTypeDescription
typestringData type: string, number, boolean, array, object
defaultanyDefault value
descriptionstringDocumentation

Visibility Modes (v2.2+)

ModeDescription
sharedBroadcast to all users (default)
privateStored on server, not broadcast
anonymousNo userId attached

Example:

json
{
  "storage": {
    "schema": {
      "count": {
        "type": "number",
        "default": 0,
        "description": "Click counter"
      },
      "lastClicker": {
        "type": "string",
        "description": "User ID of last clicker"
      },
      "history": {
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "userId": { "type": "string" },
            "timestamp": { "type": "string", "format": "date-time" }
          }
        },
        "maxItems": 100,
        "description": "Click history"
      },
      "myVote": {
        "type": "number",
        "description": "User's private vote"
      }
    },
    "visibility": {
      "count": "shared",
      "lastClicker": "shared",
      "history": "shared",
      "myVote": "private"
    }
  }
}

Settings UI

Configure custom settings dialog.

FieldTypeDefaultDescription
modestring"auto""auto" (generated from props) or "custom"
entrystring-Custom settings HTML file (if mode: "custom")
widthnumber400Settings dialog width
heightnumber500Settings dialog height

Example:

json
{
  "settings": {
    "mode": "custom",
    "entry": "settings.html",
    "width": 500,
    "height": 600
  }
}

Preview (Static Mode)

Configure static preview generation when component is off-screen.

FieldTypeDefaultDescription
modestring"auto""auto", "manual", or "disabled"
formatstring"svg"Preview format: "svg", "png", "webp"
fallbackstring-Fallback image path
staleIndicatorbooleantrueShow indicator when preview is outdated
staleTimeoutnumber5000Milliseconds before preview is marked stale

Example:

json
{
  "preview": {
    "mode": "auto",
    "format": "svg",
    "fallback": "assets/placeholder.svg",
    "staleIndicator": true,
    "staleTimeout": 5000,
    "generator": {
      "selector": "#preview-root",
      "width": 300,
      "height": 200,
      "scale": 1
    }
  }
}

Rendering & Performance

Control lazy loading and rendering optimization.

FieldTypeDefaultDescription
lazyLoadbooleantrueLoad component only when in viewport
viewport.marginnumber200Pixels before viewport to start loading
prioritystring"normal"Render priority: "low", "normal", "high"
keepAlivebooleanfalseKeep component loaded when off-screen
keepAliveTimeoutnumber30000Milliseconds before unloading

Example:

json
{
  "rendering": {
    "lazyLoad": true,
    "viewport": {
      "margin": 200
    },
    "priority": "high",
    "keepAlive": true,
    "keepAliveTimeout": 60000
  }
}

Backend & Secrets

Configure API proxying and secret management.

Backend Endpoints

json
{
  "backend": {
    "endpoints": [
      {
        "path": "/api/jira/*",
        "target": "https://api.atlassian.com",
        "auth": {
          "type": "header",
          "name": "Authorization",
          "value": "Bearer {{JIRA_TOKEN}}"
        },
        "rateLimit": {
          "requests": 100,
          "window": "1m"
        }
      }
    ]
  }
}

Secrets

FieldTypeDescription
descriptionstringHuman-readable description
requiredbooleanMust be configured before use
scopestring"organization", "board", or "user"
rotatablebooleanCan be rotated/updated

Example:

json
{
  "secrets": {
    "JIRA_TOKEN": {
      "description": "Jira API Token",
      "required": true,
      "scope": "organization",
      "rotatable": true
    },
    "OPENAI_KEY": {
      "description": "OpenAI API Key",
      "required": false,
      "scope": "user",
      "rotatable": true
    }
  }
}

Permissions

Define role-based access control.

ResourcePermissionsDescription
storage["read", "write"]Access to shared state
props["read", "write"]Access to configuration
backend["*"] or specific endpointsAPI proxy access

Example:

json
{
  "permissions": {
    "storage": {
      "host": ["read", "write"],
      "guest": ["read", "write"]
    },
    "props": {
      "host": ["read", "write"],
      "guest": ["read"]
    },
    "backend": {
      "host": ["*"],
      "guest": ["GET /api/jira/issues"]
    }
  }
}

Global Events (v2.2+)

Cross-component communication via events.

FieldTypeDescription
emitstring[]Events this component can send
listenstring[]Events this component can receive

Example:

json
{
  "globalEvents": {
    "emit": ["lesson:start", "lesson:end", "quiz:*"],
    "listen": ["timer:*", "lesson:*"]
  }
}

Wildcard patterns (*) match multiple events.


Presence (Real-time Cursors)

Track and display user cursors inside the component.

FieldTypeDefaultDescription
enabledbooleanfalseEnable cursor tracking
throttlenumber50Throttle interval (ms) for cursor updates
showCursorsbooleantrueRender cursors by default

Example:

json
{
  "presence": {
    "enabled": true,
    "throttle": 50,
    "showCursors": true
  }
}

Undo/Redo

Integrate with global undo/redo stack (Ctrl+Z).

FieldTypeDefaultDescription
enabledbooleanfalseEnable undo/redo integration
maxHistorynumber50Maximum checkpoints
groupingTimeoutnumber1000Group changes within N ms

Example:

json
{
  "undoRedo": {
    "enabled": true,
    "maxHistory": 100,
    "groupingTimeout": 500
  }
}

Debug & Logging

Configure remote logging for production debugging.

FieldTypeDefaultDescription
remoteLogsbooleanfalseSend logs to server
logLevelstring"error"Minimum level: "debug", "info", "warn", "error"
retentionstring"24h"Log retention period

Example:

json
{
  "debug": {
    "remoteLogs": true,
    "logLevel": "warn",
    "retention": "7d"
  }
}

Webhooks (v2.2+)

Receive external events from third-party services.

Example:

json
{
  "webhooks": {
    "jira": {
      "events": ["issue:created", "issue:updated"],
      "filter": {
        "project": "MYPROJECT"
      }
    },
    "github": {
      "events": ["push", "pull_request:*"]
    },
    "custom": {
      "endpoint": "/webhooks/my-service",
      "secret": "{{MY_WEBHOOK_SECRET}}",
      "events": ["*"]
    }
  }
}

Export (v2.2+)

Define data export formats.

FieldTypeDescription
formatsstring[]Built-in formats: "csv", "json", "xlsx", "pdf"
customFormatsobjectCustom export handlers

Example:

json
{
  "export": {
    "formats": ["csv", "json", "xlsx"],
    "customFormats": {
      "report": {
        "label": "Monthly Report",
        "handler": "exports/monthly-report.js"
      }
    }
  }
}

Connectors (v2.2+)

Enable diagram-style connections between components.

Example:

json
{
  "connectors": {
    "enabled": true,
    "ports": [
      {
        "id": "input-left",
        "position": "left",
        "offset": { "x": 0, "y": 50 },
        "type": "input",
        "accepts": ["data", "request"]
      },
      {
        "id": "output-right",
        "position": "right",
        "offset": { "x": 100, "y": 50 },
        "type": "output",
        "outputs": ["response", "data"]
      }
    ],
    "validation": true
  }
}

Accessibility (v2.2+)

Configure accessibility features.

FieldTypeDefaultDescription
keyboardNavigationbooleanfalseEnable Tab/Arrow navigation
screenReaderSupportbooleanfalseARIA labels and live regions
highContrastSupportbooleanfalseRespect prefers-contrast
reduceMotionSupportbooleanfalseRespect prefers-reduced-motion
rolestring-ARIA role (e.g., "application")
labelstring-ARIA label

Example:

json
{
  "accessibility": {
    "keyboardNavigation": true,
    "screenReaderSupport": true,
    "highContrastSupport": true,
    "reduceMotionSupport": true,
    "role": "application",
    "label": "Interactive countdown timer"
  }
}

Internationalization (v2.2+)

Multi-language support.

FieldTypeDescription
defaultLocalestringDefault locale code (e.g., "en")
supportedLocalesstring[]Supported locale codes
translationsobjectLocale to translation file mapping
dateFormatstring"auto", "ISO", or "locale"
numberFormatstring"auto" or locale-specific

Example:

json
{
  "i18n": {
    "defaultLocale": "en",
    "supportedLocales": ["en", "ru", "de", "es", "zh"],
    "translations": {
      "en": "i18n/en.json",
      "ru": "i18n/ru.json",
      "de": "i18n/de.json"
    },
    "dateFormat": "locale",
    "numberFormat": "auto"
  }
}

Offline Support (v2.2+)

Enable offline functionality and sync.

FieldTypeDefaultDescription
enabledbooleanfalseEnable offline support
persistencestring"indexeddb"Storage: "indexeddb", "localstorage", "none"
maxPendingOperationsnumber1000Queue size for offline operations
retryStrategystring"exponential"Retry: "exponential", "linear", "immediate"

Example:

json
{
  "offline": {
    "enabled": true,
    "persistence": "indexeddb",
    "maxPendingOperations": 500,
    "retryStrategy": "exponential"
  }
}

Performance Tuning (v2.2+)

Rate limiting and batching configuration.

Example:

json
{
  "performance": {
    "rateLimit": {
      "debounce": 300,
      "throttle": 50,
      "maxBurst": 10
    },
    "batching": {
      "enabled": true,
      "maxBatchSize": 50,
      "flushInterval": 100
    }
  }
}

Runtime Assets (v2.3+)

User-uploaded files (images, audio, video).

FieldTypeDefaultDescription
enabledbooleanfalseEnable file uploads
maxFileSizenumber10485760Max file size (bytes, default 10MB)
maxTotalStoragenumber104857600Total storage per board (default 100MB)
allowedTypesstring[]-MIME types allowed

Example:

json
{
  "runtimeAssets": {
    "enabled": true,
    "maxFileSize": 5242880,
    "maxTotalStorage": 52428800,
    "allowedTypes": [
      "image/jpeg",
      "image/png",
      "image/webp",
      "audio/mpeg",
      "video/mp4"
    ],
    "imageOptimization": {
      "maxWidth": 2000,
      "maxHeight": 2000,
      "quality": 85,
      "format": "webp"
    },
    "thumbnails": {
      "sizes": [100, 200, 400],
      "format": "webp"
    }
  }
}

Transient State (v2.3+)

High-frequency ephemeral updates (cursors, selections).

FieldTypeDefaultDescription
enabledbooleanfalseEnable transient updates
maxUpdatesPerSecondnumber60Rate limit per key
maxKeysnumber10Concurrent transient keys
maxPayloadSizenumber1024Max bytes per update
persistOnDisconnectbooleanfalseSave to DB on disconnect
persistOnUnloadbooleanfalseSave on page close

Example:

json
{
  "transient": {
    "enabled": true,
    "maxUpdatesPerSecond": 60,
    "maxKeys": 5,
    "maxPayloadSize": 512,
    "persistOnDisconnect": false,
    "persistOnUnload": false
  }
}

Marketplace

Configure marketplace listing.

FieldTypeDescription
categorystringCategory: "productivity", "education", "collaboration", etc.
tagsstring[]Search tags
pricingstring"free", "paid", or "freemium"
screenshotsstring[]Screenshot paths

Example:

json
{
  "marketplace": {
    "category": "productivity",
    "tags": ["timer", "countdown", "productivity"],
    "pricing": "free",
    "screenshots": [
      "assets/screenshot-1.png",
      "assets/screenshot-2.png"
    ]
  }
}

Migrations

Version migration scripts.

Example:

json
{
  "migrations": {
    "1.x-to-2.x": "migrations/1-to-2.js",
    "2.0-to-2.1": "migrations/2.0-to-2.1.js"
  }
}

See CLI migrate command for details.


Complete Example

Minimal component manifest:

json
{
  "$schema": "https://boardapi.io/schemas/manifest-v2.4.json",
  "name": "my-timer",
  "version": "1.0.0",
  "title": "My Timer",
  "description": "A simple countdown timer",
  "author": "John Doe <john@example.com>",
  "license": "MIT",

  "entry": "component.js",
  "styles": "styles.css",

  "dimensions": {
    "width": 300,
    "height": 200,
    "resizable": true
  },

  "props": {
    "duration": {
      "type": "number",
      "default": 60,
      "minimum": 1,
      "maximum": 3600,
      "ui": {
        "label": "Duration (seconds)",
        "widget": "slider"
      }
    }
  },

  "storage": {
    "schema": {
      "timeRemaining": {
        "type": "number",
        "default": 0
      }
    }
  }
}

Full example with all features:

json
{
  "$schema": "https://boardapi.io/schemas/manifest-v2.4.json",
  "name": "advanced-component",
  "version": "2.4.0",
  "title": "Advanced Component",
  "description": "Full-featured example component",

  "entry": "component.js",
  "styles": "styles.css",

  "dimensions": {
    "width": 400,
    "height": 300,
    "minWidth": 300,
    "minHeight": 200,
    "resizable": true,
    "aspectRatio": "16:9"
  },

  "props": {
    "theme": {
      "type": "string",
      "enum": ["light", "dark", "auto"],
      "default": "auto",
      "ui": { "label": "Theme", "widget": "radio" }
    }
  },

  "storage": {
    "schema": {
      "count": { "type": "number", "default": 0 },
      "myVote": { "type": "number" }
    },
    "visibility": {
      "count": "shared",
      "myVote": "private"
    }
  },

  "preview": {
    "mode": "auto",
    "format": "svg"
  },

  "rendering": {
    "lazyLoad": true,
    "priority": "normal"
  },

  "backend": {
    "endpoints": [{
      "path": "/api/data/*",
      "target": "https://api.example.com",
      "rateLimit": { "requests": 100, "window": "1m" }
    }]
  },

  "permissions": {
    "storage": { "host": ["read", "write"], "guest": ["read"] },
    "props": { "host": ["read", "write"], "guest": ["read"] }
  },

  "globalEvents": {
    "emit": ["component:*"],
    "listen": ["lesson:*"]
  },

  "presence": { "enabled": true },
  "undoRedo": { "enabled": true },

  "accessibility": {
    "keyboardNavigation": true,
    "screenReaderSupport": true
  },

  "i18n": {
    "defaultLocale": "en",
    "supportedLocales": ["en", "ru"],
    "translations": {
      "en": "i18n/en.json",
      "ru": "i18n/ru.json"
    }
  },

  "marketplace": {
    "category": "productivity",
    "tags": ["example", "demo"],
    "pricing": "free"
  }
}

Next Steps