Skip to content

manifest.json

manifest.json is the only widget file that is not code: it declares what the widget uses and how it is configured. Everything Widget reads comes from here. It is plain JSON (no comments or trailing commas) and must be an object. The Studio watches it: every mistake shows in the validator with its code.

{
"size": { "width": 800, "height": 600 },
"scene": { "width": 1920, "height": 1080 },
"events": ["Twitch.Follow", "Kick.Follow"],
"actions": [],
"sendMessage": false,
"assets": ["bell.mp3"],
"strings": {
"es": { "follow": "¡Nuevo follow de {name}!" },
"en": { "follow": "New follower: {name}!" }
},
"queue": { "durationSeconds": 5, "gapSeconds": 0 },
"menu": { "sections": [] }
}

The list of events the widget listens to, using the names in the events reference. The SDK only delivers declared events, and “Configure” uses them to tell the viewer what is needed. Common mistakes: event_not_declared, manifest_unknown_event and event_unused.

  • actions: the list of Streamer.bot action names the widget runs with Widget.streamerbot.doAction. “Configure” shows them to the viewer.
  • sendMessage: true if the widget writes in the chat with Widget.streamerbot.sendMessage. With true, the Streamer.bot password becomes required in the “Connection” section.

The texts per language, read with Widget.t. One object per language, and es is required: it is the base, and whatever is missing in another language shows in Spanish. Values are text, with {name} for variables.

The list of files from your library that the widget uses (up to 30), by name with extension, like "bell.mp3". They are used with Widget.assets. Names are lowercase, with numbers and hyphens.

The parameter menu the viewer sees in “Configure”. It has sections, and each section its fields:

{
"menu": {
"sections": [
{
"id": "text",
"title": { "es": "Texto", "en": "Text" },
"fields": [
{
"type": "number",
"id": "fontSize",
"param": "fontSize",
"label": { "es": "Tamaño de letra", "en": "Font size" },
"default": 24,
"min": 12,
"max": 72,
"step": 1,
"suffix": "px"
}
]
}
]
}
}
  • param is the name the code reads with Widget.parameters. It has letters, numbers and _, starts with a letter and is not repeated. address, port, password, diseno, diseño and designParam are reserved.
  • label, title and note are texts per language, like { "es": "…", "en": "…" }.
  • default must fit the field type.
  • The types are: switch, color, range, select, font, number, password, text, image, video, audio and platforms. range and number accept min, max and step; number, suffix; select and font, options; image, video and audio, a file from assets as default.

You do not have to declare them; they are added at the end of the menu by themselves:

  • Platforms, if the widget listens to events from more than one platform.
  • Texts (language), if strings has more than one language.
  • Design, if designs has more than one.
  • Connection, always: Streamer.bot host, port, password and connection type, and the TikFinity port if it listens to TikTok.

A list of designs the viewer can use to change the look: strings, or { "value": "light", "label": { … } }. The chosen one is left in Widget.design and in <html data-design>, to style it from CSS.

Tunes Widget.queue. All are numbers, 0 or more.

  • durationSeconds: how long a task lasts if nothing else is given (5 by default).
  • gapSeconds: pause between one task and the next (0 by default).
  • taskLimitSeconds: the most a task can last (90 by default).
  • maxPending: tasks that fit while waiting (50 by default); with a full queue the lowest priority is dropped.

status.graceSeconds is how many seconds Widget.status takes to switch to "disconnected" after losing the connection (15 by default), so a brief cut does not flicker on screen.

The size of the OBS browser source (size) and of the scene it goes in (scene), each as { "width", "height" } in whole pixels, from 16 to 7680 wide and 16 to 4320 tall. A new widget ships 800 × 600 in 1920 × 1080, and one without them was made for 1920 × 1080. They are changed from “Size in OBS” in the editor.

The no-code alerts design. The visual editor writes it: it is not edited by hand. It has its own size allowance (up to 128 KB of design) and its own limits: 24 alerts, 20 variants per alert, 12 layers, 12 groups and 60 files. If you need more control, do it from your part of script.js with WidgetAlerts and AlertRuntime.