Skip to content
developers
Developer home

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" } }
}
}
}
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.

  • 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 and pack adds them.

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 return plugin.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.

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.