VISWOO DOCUMENTATION
Manifest
viswoo-plugin.json fields, package rules, the settings schema and placement on screens.
Every package has viswoo-plugin.json at its root. The schema ships with the SDK:
@viswoo/plugin-sdk/schemas/plugin-manifest.schema.json (link it in your editor with "$schema").
{ "schemaVersion": 1, "code": "deal-of-the-day", "version": "1.0.0", "name": { "tr": "Günün fırsatı", "en": "Deal of the day" }, "summary": { "tr": "Ekranda günün fırsatını gösterir.", "en": "Shows the deal of the day on screen." }, "publisher": { "name": "Example Software", "url": "https://example.com" }, "category": "content", "icon": "icon.png", "screenshots": ["screenshots/tv.png"], "billingUnit": "perTenant", "permissions": ["settings"], "panel": { "menu": { "label": { "tr": "Fırsat", "en": "Deal" }, "icon": "tag" } }, "player": { "entry": "player.html", "defaultDuration": 15 }, "settings": { "type": "object", "required": ["title"], "properties": { "title": { "type": "string", "minLength": 1, "maxLength": 60, "x-viswoo-label": { "tr": "Başlık", "en": "Title" } } } }}Fields
Section titled “Fields”| Field | Required | Description |
|---|---|---|
schemaVersion |
yes | 1 |
code |
yes | Permanent id: kebab-case, ASCII, 3–40 characters. Cannot change after publishing |
version |
yes | major.minor.patch; the same version cannot be uploaded twice |
name, summary |
yes | { "tr", "en" }; name at most 60, summary at most 200 characters |
description |
Store detail page, Markdown (paragraphs, headings, lists, bold, links), at most 5000 characters | |
publisher |
yes | { "name", "url" }; https address. Viswoo grants the verified badge |
category |
yes | interactive, content, information, integration, reporting, device |
icon |
yes | Store icon, 256 px square PNG |
screenshots |
Up to 6 images; at least one 16:9 TV image when there is a screen view | |
billingUnit |
yes | perScreen, perTenant, included. The price is not in the package; it is agreed with Viswoo |
requiredCapabilities |
E.g. ["touch"]: the plugin cannot be enabled on screens whose device does not report it |
|
minProtocol |
At least 3 (default) for plugins with a screen view | |
permissions |
See Concepts | |
panel |
{ "menu": { "label", "icon" }, "entry"?, "tab"? }: menu item, your own tab and its name |
|
player |
{ "entry", "defaultDuration", "placement"? }: screen view |
|
public |
{ "entry" }: public page; needs the public permission |
|
settings |
JSON Schema of the settings (below); needs the settings permission |
|
draw |
Draw pools (Server functions); needs the draw permission |
|
server |
{ "webhookUrl", "events"? } (Your own server); needs the server permission |
The menu icon (panel.menu.icon) is one of: bell, calendar, chart-bar, chart-no-axes-combined, chart-pie,
circle-dollar-sign, clipboard-list, cloud-sun, coffee, ferris-wheel, gift, hand, heart, image,
layout-template, list-checks, map-pin, megaphone, message-square, music, newspaper, percent, puzzle,
qr-code, rss, shopping-cart, smile, sparkles, star, store, tag, thermometer, ticket, trophy,
users, utensils, video, zap.
Package rules
Section titled “Package rules”- At most 5 MB packed, 20 MB unpacked and 200 files.
- File types:
html,js,css,json,png,webp,jpg,jpeg,gif,woff2,txt,md. No SVG (it can run scripts). - Relative paths with letters, digits,
.,_,-,/only. No.., absolute paths, backslashes or:. - The screen view is a single ES5 file of at most 512 KB (Screen view).
- SDK files (
viswoo-panel.js,viswoo-player.js,viswoo-public.js,viswoo-ui.css,viswoo-screen.css) are not put in the package; pages reference them by name andpackadds them.
Settings schema
Section titled “Settings schema”The panel draws the Settings tab from the settings schema, in schema order.
| Schema | In the panel |
|---|---|
string |
Text; format: "date" date, "date-time" date and time; enum select |
integer, number |
Number; minimum, maximum |
boolean |
Switch |
object |
Group of fields with a heading |
array (of object) |
Rows: add, remove, reorder; minItems, maxItems |
Supported keywords: required, minLength, maxLength, pattern, default (used for empty installs and fields
missing from older settings).
Viswoo extensions:
| Extension | Effect |
|---|---|
x-viswoo-label, x-viswoo-help |
{ "tr", "en" } label and help text (otherwise title, description) |
x-viswoo-widget |
textarea, color, id (hidden, auto-generated row id) |
x-viswoo-visibility: "server" |
The field never reaches screens or phones; the panel and your server see it |
"slices": { "type": "array", "minItems": 2, "x-viswoo-label": { "tr": "Dilimler", "en": "Slices" }, "items": { "type": "object", "required": ["id", "label", "weight"], "properties": { "id": { "type": "string", "pattern": "^[a-z0-9-]{1,24}$", "x-viswoo-widget": "id" }, "label": { "type": "string", "minLength": 1, "x-viswoo-label": { "tr": "Ad", "en": "Label" } }, "weight": { "type": "integer", "minimum": 0, "x-viswoo-visibility": "server", "x-viswoo-label": { "tr": "Şans", "en": "Chance" } } } }}- Every field the plugin needs to work is
required. If saved settings do not match the schema, setup is incomplete: the plugin does not play and server actions and the public page returnplugin.setup_incomplete. - Settings that do not match the schema are not saved (
plugin.invalid_settings). - If a new version adds a required field, installs pause until the customer fills it in; give new required fields a
default.
Placement on screens
Section titled “Placement on screens”For plugins with a screen view the customer chooses, in the Screens tab, the display mode, the screens (all, selected, tagged), the date range and an on/off switch.
| Mode | On screen |
|---|---|
continuous |
The plugin takes over playback (opening hours and emergency alerts still apply) |
interval |
Every everyMinutes minutes for durationSeconds seconds, between regular content |
playlist |
Only when added to a playlist as an item |
"player": { "entry": "player.html", "defaultDuration": 20, "placement": { "modes": ["interval", "continuous", "playlist"], "default": "interval", "everyMinutes": 10, "durationSeconds": 30 }}modes lists the allowed modes; if omitted all three are allowed and interval is the default. You do not need your
own campaign date settings: outside the placement’s date range the plugin does not play and server actions return
plugin.not_live.