{"ok":true,"widgets":[{"type":"kpi","name":"KPI","description":"A headline number with change vs. previous value and a trend sparkline.","category":"metrics","supportsAppend":false,"interactive":false,"defaultSize":{"w":3,"h":3,"minW":2,"minH":2},"configSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"title":{"default":"","title":"Title","type":"string","maxLength":120},"staleAfter":{"default":0,"title":"Mark stale after (seconds)","description":"0 = never. Dims the widget and says Stale when no push arrives in time.","type":"integer","minimum":0,"maximum":86400},"icon":{"default":"","title":"Icon","description":"lucide icon name, e.g. wallet, users, cpu","type":"string","maxLength":40},"prefix":{"default":"","title":"Prefix","description":"e.g. $","type":"string","maxLength":8},"suffix":{"default":"","title":"Suffix","description":"e.g. %, ms, users","type":"string","maxLength":12},"decimals":{"default":0,"title":"Decimals","type":"integer","minimum":0,"maximum":6},"compact":{"default":true,"title":"Compact numbers","description":"Show 12.3K instead of 12,300","type":"boolean"},"higherIsBetter":{"default":true,"title":"Higher is better","type":"boolean"},"compareTo":{"default":"previous","title":"Compare to","description":"previous push, or the value 1 hour / 1 day / 1 week earlier","type":"string","enum":["previous","1h","1d","7d"]},"showSparkline":{"default":true,"title":"Show trend","type":"boolean"},"caption":{"default":"","title":"Caption","type":"string","maxLength":80},"thresholds":{"default":[],"title":"Color thresholds","maxItems":20,"type":"array","items":{"type":"object","properties":{"above":{"type":"number","title":"When value ≥"},"tone":{"type":"string","enum":["default","success","warning","danger","info"],"title":"Show as"}},"required":["above","tone"]}}}},"dataSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"value":{"anyOf":[{"anyOf":[{"type":"number"},{"type":"string","pattern":"^-?\\d+(\\.\\d+)?$"}]},{"type":"null"}]},"previous":{"anyOf":[{"anyOf":[{"type":"number"},{"type":"string","pattern":"^-?\\d+(\\.\\d+)?$"}]},{"type":"null"}]},"history":{"default":[],"type":"array","items":{"type":"number"}},"points":{"default":[],"ui":"hidden","maxItems":2000,"type":"array","items":{"type":"array","prefixItems":[{"type":"number"},{"type":"number"}],"items":false,"minItems":2,"maxItems":2}}}},"examples":[{"label":"Set the value","body":{"value":48320}},{"label":"Set value and comparison","body":{"value":48320,"previous":45910}}]},{"type":"stats","name":"Stat list","description":"Several small numbers side by side, each with an optional change.","category":"metrics","supportsAppend":false,"interactive":false,"defaultSize":{"w":6,"h":2,"minW":3,"minH":2},"configSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"title":{"default":"","title":"Title","type":"string","maxLength":120},"staleAfter":{"default":0,"title":"Mark stale after (seconds)","description":"0 = never. Dims the widget and says Stale when no push arrives in time.","type":"integer","minimum":0,"maximum":86400},"layout":{"default":"row","title":"Layout","type":"string","enum":["row","grid","list"]}}},"dataSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"items":{"default":[],"maxItems":24,"type":"array","items":{"type":"object","properties":{"label":{"type":"string","maxLength":40},"value":{"type":["number","string"]},"change":{"type":["number","null"]},"unit":{"type":"string","maxLength":12}},"required":["label","value"]}}}},"examples":[{"label":"Replace all items","body":{"items":[{"label":"Visitors","value":12840,"change":8.1},{"label":"Signups","value":342}]}}]},{"type":"gauge","name":"Gauge","description":"A dial for a value within a range — CPU, temperature, utilisation.","category":"metrics","supportsAppend":false,"interactive":false,"defaultSize":{"w":3,"h":4,"minW":2,"minH":3},"configSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"title":{"default":"","title":"Title","type":"string","maxLength":120},"staleAfter":{"default":0,"title":"Mark stale after (seconds)","description":"0 = never. Dims the widget and says Stale when no push arrives in time.","type":"integer","minimum":0,"maximum":86400},"min":{"default":0,"title":"Min","type":"number"},"max":{"default":100,"title":"Max","type":"number"},"suffix":{"default":"%","title":"Suffix","type":"string","maxLength":12},"decimals":{"default":0,"title":"Decimals","type":"integer","minimum":0,"maximum":4},"thresholds":{"default":[{"above":70,"tone":"warning"},{"above":90,"tone":"danger"}],"title":"Color thresholds","maxItems":20,"type":"array","items":{"type":"object","properties":{"above":{"type":"number","title":"When value ≥"},"tone":{"type":"string","enum":["default","success","warning","danger","info"],"title":"Show as"}},"required":["above","tone"]}}}},"dataSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"value":{"anyOf":[{"anyOf":[{"type":"number"},{"type":"string","pattern":"^-?\\d+(\\.\\d+)?$"}]},{"type":"null"}]}}},"examples":[{"label":"Set the value","body":{"value":63}}]},{"type":"progress","name":"Progress","description":"Progress toward a goal, as a bar or ring.","category":"metrics","supportsAppend":false,"interactive":false,"defaultSize":{"w":3,"h":2,"minW":2,"minH":2},"configSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"title":{"default":"","title":"Title","type":"string","maxLength":120},"staleAfter":{"default":0,"title":"Mark stale after (seconds)","description":"0 = never. Dims the widget and says Stale when no push arrives in time.","type":"integer","minimum":0,"maximum":86400},"style":{"default":"bar","title":"Style","type":"string","enum":["bar","ring"]},"goal":{"default":100,"title":"Goal","type":"number","exclusiveMinimum":0},"unit":{"default":"","title":"Unit","type":"string","maxLength":12},"tone":{"default":"info","title":"Color","type":"string","enum":["default","success","warning","danger","info"]}}},"dataSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"value":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^-?\\d+(\\.\\d+)?$"}]},"label":{"default":"","type":"string","maxLength":80}}},"examples":[{"label":"Update progress","body":{"value":27}}]},{"type":"line","name":"Line chart","description":"One or more series over time. Push points and the chart scrolls live.","category":"charts","supportsAppend":true,"interactive":false,"defaultSize":{"w":6,"h":5,"minW":3,"minH":3},"configSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"title":{"default":"","title":"Title","type":"string","maxLength":120},"staleAfter":{"default":0,"title":"Mark stale after (seconds)","description":"0 = never. Dims the widget and says Stale when no push arrives in time.","type":"integer","minimum":0,"maximum":86400},"xAxis":{"default":"time","title":"X axis","description":"time = timestamps","type":"string","enum":["time","category"]},"yLabel":{"default":"","title":"Y axis label","type":"string","maxLength":30},"maxPoints":{"default":200,"title":"Keep last N points","type":"integer","minimum":2,"maximum":2000},"showLegend":{"default":true,"title":"Legend","type":"boolean"},"area":{"default":true,"title":"Fill area","type":"boolean"},"smooth":{"default":true,"title":"Smooth lines","type":"boolean"},"stacked":{"default":false,"title":"Stacked","type":"boolean"}}},"dataSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"series":{"default":[],"description":"Usually pushed from code with {\"append\": {...}}; x values are ms timestamps.","maxItems":12,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","maxLength":60},"points":{"default":[],"maxItems":2000,"type":"array","items":{"type":"array","prefixItems":[{"type":["number","string"]},{"type":"number"}],"items":false,"minItems":2,"maxItems":2}},"color":{"ui":"color","title":"Color (optional)","type":"string"}},"required":["name"]}}}},"examples":[{"label":"Append a point to each series (x = now)","body":{"append":{"api":912,"web":455}}},{"label":"Append with an explicit timestamp","body":{"append":{"api":[1767225600000,912]}}}]},{"type":"bar","name":"Bar chart","description":"Compare values across categories. Vertical or horizontal, grouped or stacked.","category":"charts","supportsAppend":false,"interactive":false,"defaultSize":{"w":6,"h":5,"minW":3,"minH":3},"configSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"title":{"default":"","title":"Title","type":"string","maxLength":120},"staleAfter":{"default":0,"title":"Mark stale after (seconds)","description":"0 = never. Dims the widget and says Stale when no push arrives in time.","type":"integer","minimum":0,"maximum":86400},"horizontal":{"default":false,"title":"Horizontal","type":"boolean"},"stacked":{"default":false,"title":"Stacked","type":"boolean"},"yLabel":{"default":"","title":"Value axis label","type":"string","maxLength":30},"showLegend":{"default":true,"title":"Legend","type":"boolean"},"showValues":{"default":false,"title":"Show values on bars","type":"boolean"}}},"dataSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"categories":{"default":[],"maxItems":200,"type":"array","items":{"type":"string","maxLength":60}},"series":{"default":[],"maxItems":12,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","maxLength":60},"values":{"type":"array","items":{"type":["number","null"]}},"color":{"ui":"color","title":"Color (optional)","type":"string"}},"required":["name","values"]}}}},"examples":[{"label":"Replace the data","body":{"categories":["Mon","Tue","Wed"],"series":[{"name":"Orders","values":[12,19,7]}]}}]},{"type":"pie","name":"Pie / donut","description":"Share of a whole across a few categories.","category":"charts","supportsAppend":false,"interactive":false,"defaultSize":{"w":4,"h":5,"minW":3,"minH":3},"configSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"title":{"default":"","title":"Title","type":"string","maxLength":120},"donut":{"default":true,"title":"Donut","type":"boolean"},"showLegend":{"default":true,"title":"Legend","type":"boolean"},"showPercent":{"default":true,"title":"Show percentages","type":"boolean"}}},"dataSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"slices":{"default":[],"maxItems":30,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","maxLength":60},"value":{"type":"number","minimum":0},"color":{"ui":"color","title":"Color (optional)","type":"string"}},"required":["name","value"]}}}},"examples":[{"label":"Replace slices","body":{"slices":[{"name":"Yes","value":62},{"name":"No","value":38}]}}]},{"type":"scatter","name":"Scatter","description":"Correlation between two measures, with an optional linear trend line.","category":"charts","supportsAppend":true,"interactive":false,"defaultSize":{"w":6,"h":5,"minW":3,"minH":3},"configSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"title":{"default":"","title":"Title","type":"string","maxLength":120},"xLabel":{"default":"","title":"X axis label","type":"string","maxLength":30},"yLabel":{"default":"","title":"Y axis label","type":"string","maxLength":30},"trendLine":{"default":true,"title":"Trend line","type":"boolean"},"maxPoints":{"default":1000,"title":"Keep last N points","type":"integer","minimum":2,"maximum":5000}}},"dataSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"series":{"default":[],"maxItems":8,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","maxLength":60},"points":{"maxItems":5000,"type":"array","items":{"type":"array","prefixItems":[{"type":"number"},{"type":"number"}],"items":false,"minItems":2,"maxItems":2}}},"required":["name","points"]}}}},"examples":[{"label":"Append a point","body":{"append":{"Campaigns":[820,74]}}}]},{"type":"radar","name":"Radar","description":"Compare a few profiles across the same set of dimensions.","category":"charts","supportsAppend":false,"interactive":false,"defaultSize":{"w":4,"h":5,"minW":3,"minH":4},"configSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"title":{"default":"","title":"Title","type":"string","maxLength":120},"showLegend":{"default":true,"title":"Legend","type":"boolean"}}},"dataSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"indicators":{"default":[],"maxItems":16,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","maxLength":40},"max":{"type":"number","exclusiveMinimum":0}},"required":["name","max"]}},"series":{"maxItems":6,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","maxLength":60},"values":{"type":"array","items":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^-?\\d+(\\.\\d+)?$"}]}}},"required":["name","values"]}}}},"examples":[{"label":"Set axes and values","body":{"indicators":[{"name":"Tests","max":100},{"name":"Docs","max":100},{"name":"Perf","max":100},{"name":"Security","max":100},{"name":"UX","max":100}],"series":[{"name":"v2.0","values":[95,72,85,88,80]}]}}]},{"type":"tree","name":"Tree / org chart","description":"Hierarchies: org charts, file trees, decision trees.","category":"charts","supportsAppend":false,"interactive":false,"defaultSize":{"w":6,"h":6,"minW":4,"minH":4},"configSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"title":{"default":"","title":"Title","type":"string","maxLength":120},"orientation":{"default":"TB","title":"Direction","description":"TB = top→bottom, LR = left→right","type":"string","enum":["TB","LR"]},"expandDepth":{"default":3,"title":"Initially expanded levels","type":"integer","minimum":1,"maximum":10}}},"dataSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"root":{"default":null,"anyOf":[{"$ref":"#/$defs/__schema0"},{"type":"null"}]}},"$defs":{"__schema0":{"type":"object","properties":{"name":{"type":"string","maxLength":80},"value":{"type":"number"},"children":{"maxItems":200,"type":"array","items":{"$ref":"#/$defs/__schema0"}}},"required":["name"]}}},"examples":[{"label":"Replace the tree","body":{"root":{"name":"Root","children":[{"name":"A"},{"name":"B"}]}}}]},{"type":"table","name":"Table","description":"Rows of data with sorting and search. Append rows from scripts.","category":"data","supportsAppend":true,"interactive":true,"defaultSize":{"w":6,"h":5,"minW":3,"minH":4},"configSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"title":{"default":"","title":"Title","type":"string","maxLength":120},"staleAfter":{"default":0,"title":"Mark stale after (seconds)","description":"0 = never. Dims the widget and says Stale when no push arrives in time.","type":"integer","minimum":0,"maximum":86400},"searchable":{"default":true,"title":"Search box","type":"boolean"},"maxRows":{"default":500,"title":"Keep last N rows","type":"integer","minimum":1,"maximum":2000},"newestFirst":{"default":true,"title":"Newest rows on top","type":"boolean"},"rowKey":{"title":"Row key field","description":"Identifies a row; row actions send its value","type":"string","maxLength":64},"rowActions":{"default":[],"title":"Row actions","maxItems":6,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,40}$","title":"Id","description":"The connector action is <widget key>/<id>"},"label":{"type":"string","minLength":1,"maxLength":30,"title":"Label"},"tone":{"default":"default","title":"Color","type":"string","enum":["default","success","warning","danger","info"]},"confirm":{"title":"Tap twice to confirm","type":"boolean"},"when":{"title":"Only when","description":"Clauses on the record, e.g. [{field:\"status\",op:\"in\",value:[\"failed\"]}]","maxItems":8,"type":"array","items":{"type":"object","properties":{"field":{"type":"string","pattern":"^[A-Za-z_][A-Za-z0-9_.-]{0,63}$"},"op":{"type":"string","enum":["eq","neq","in","nin","contains","gte","lte","set","unset"]},"value":{"anyOf":[{"anyOf":[{"type":"string","maxLength":500},{"type":"number"},{"type":"boolean"},{"type":"null"}]},{"maxItems":100,"type":"array","items":{"anyOf":[{"type":"string","maxLength":500},{"type":"number"},{"type":"boolean"},{"type":"null"}]}},{"type":"object","properties":{"now":{"type":"string"}},"required":["now"],"additionalProperties":false},{"type":"object","properties":{"param":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_-]{0,39}$"}},"required":["param"],"additionalProperties":false}]},"param":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_-]{0,39}$"}},"required":["field","op"],"additionalProperties":false}}},"required":["id","label"]}},"viewersCanUse":{"default":false,"title":"Viewers can use row actions","description":"Otherwise only editors","type":"boolean"}}},"dataSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"columns":{"default":[],"description":"Each name is a key in the rows. Renaming one here renames it in every row.","maxItems":30,"type":"array","items":{"type":"string","maxLength":60}},"rows":{"default":[],"description":"Stored oldest → newest (the board can show newest first).","maxItems":2000,"type":"array","items":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":["string","number","boolean","null"]}}},"runs":{"type":"object","propertyNames":{"type":"string","maxLength":250},"additionalProperties":{"type":"object","properties":{"status":{"type":"string","enum":["sent","done","failed","confirm","expired"]},"at":{"type":"number"},"by":{"type":"string","maxLength":60},"message":{"type":"string","maxLength":200}},"required":["status","at"]}}}},"examples":[{"label":"Append a row","body":{"append":{"Order":"#1046","Customer":"Ken T.","Total":77,"Status":"Paid"}}},{"label":"Replace all rows","body":{"rows":[{"Order":"#1047","Customer":"Ada L.","Total":54,"Status":"Paid"}]}}]},{"type":"log","name":"Live log","description":"A scrolling feed of events — perfect for bots, jobs and deploys.","category":"data","supportsAppend":true,"interactive":false,"defaultSize":{"w":6,"h":5,"minW":3,"minH":3},"configSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"title":{"default":"","title":"Title","type":"string","maxLength":120},"staleAfter":{"default":0,"title":"Mark stale after (seconds)","description":"0 = never. Dims the widget and says Stale when no push arrives in time.","type":"integer","minimum":0,"maximum":86400},"maxEntries":{"default":200,"title":"Keep last N entries","type":"integer","minimum":10,"maximum":1000},"showTime":{"default":true,"title":"Show timestamps","type":"boolean"},"monospace":{"default":true,"title":"Monospace","type":"boolean"}}},"dataSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"entries":{"default":[],"maxItems":2000,"type":"array","items":{"type":"object","properties":{"t":{"default":1792144637581,"type":"number"},"text":{"type":"string","maxLength":2000},"level":{"default":"info","type":"string","enum":["debug","info","success","warning","error"]}},"required":["text"]}}}},"examples":[{"label":"Append a line","body":{"append":"Deploy finished in 42s"}},{"label":"Append with level","body":{"append":{"text":"Disk at 91%","level":"warning"}}}]},{"type":"checklist","name":"Checklist","description":"A shared to-do list. Viewers can tick items when allowed.","category":"data","supportsAppend":true,"interactive":true,"defaultSize":{"w":4,"h":4,"minW":3,"minH":3},"configSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"title":{"default":"","title":"Title","type":"string","maxLength":120},"viewersCanEdit":{"default":false,"title":"Viewers can tick items","type":"boolean"},"showProgress":{"default":true,"title":"Show progress","type":"boolean"}}},"dataSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"items":{"default":[],"maxItems":200,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","maxLength":40},"text":{"type":"string","maxLength":200},"done":{"default":false,"type":"boolean"}},"required":["id","text"]}}}},"examples":[{"label":"Add an item","body":{"append":"Rotate API keys"}}]},{"type":"kanban","name":"Kanban board","description":"Cards in columns — drag them along as work moves. Scripts can add cards.","category":"data","supportsAppend":true,"interactive":true,"defaultSize":{"w":8,"h":5,"minW":4,"minH":3},"configSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"title":{"default":"","title":"Title","type":"string","maxLength":120},"viewersCanEdit":{"default":false,"title":"Viewers can move cards","type":"boolean"}}},"dataSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"columns":{"default":[{"id":"todo","title":"To do"},{"id":"doing","title":"Doing"},{"id":"done","title":"Done"}],"minItems":1,"maxItems":8,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":40,"title":"Id"},"title":{"type":"string","minLength":1,"maxLength":40,"title":"Title"}},"required":["id","title"]}},"cards":{"default":[],"maxItems":300,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":40},"title":{"type":"string","minLength":1,"maxLength":200},"column":{"type":"string","maxLength":40},"tag":{"type":"string","maxLength":30}},"required":["id","title","column"]}}}},"examples":[{"label":"Add a card to the first column","body":{"append":"Fix login redirect"}},{"label":"Add a card to a column","body":{"append":{"title":"Ship v2.1","column":"doing","tag":"release"}}}]},{"type":"timeline","name":"Timeline","description":"Milestones and events in order — releases, incidents, project history.","category":"data","supportsAppend":true,"interactive":false,"defaultSize":{"w":4,"h":5,"minW":3,"minH":3},"configSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"title":{"default":"","title":"Title","type":"string","maxLength":120},"newestFirst":{"default":true,"title":"Newest first","type":"boolean"},"maxEvents":{"default":100,"title":"Keep last N events","type":"integer","minimum":1,"maximum":500}}},"dataSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"events":{"default":[],"maxItems":500,"type":"array","items":{"type":"object","properties":{"date":{"type":"string","maxLength":40,"title":"Date","description":"ISO date or any label"},"title":{"type":"string","minLength":1,"maxLength":120,"title":"Title"},"detail":{"title":"Detail","type":"string","maxLength":300},"tone":{"title":"Color","type":"string","enum":["default","success","warning","danger","info"]}},"required":["date","title"]}}}},"examples":[{"label":"Add an event (dated now)","body":{"append":"Deployed v2.1"}},{"label":"Add an event with details","body":{"append":{"title":"Incident resolved","date":"2026-10-09","tone":"success"}}}]},{"type":"people","name":"Team","description":"Who's on the team and who's around — on-call, shifts, presence.","category":"data","supportsAppend":true,"interactive":false,"defaultSize":{"w":4,"h":4,"minW":2,"minH":3},"configSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"title":{"default":"","title":"Title","type":"string","maxLength":120},"showOffline":{"default":true,"title":"Show offline people","type":"boolean"}}},"dataSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"people":{"default":[],"maxItems":100,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":60,"title":"Name"},"role":{"title":"Role","type":"string","maxLength":60},"status":{"title":"Status","type":"string","enum":["online","away","busy","offline"]},"avatarUrl":{"title":"Avatar URL","anyOf":[{"type":"string","const":""},{"type":"string","format":"uri"}]}},"required":["name"]}}}},"examples":[{"label":"Update one person","body":{"append":{"name":"Maya Cohen","status":"away"}}}]},{"type":"status","name":"Status board","description":"Health of several services at a glance. Update one service at a time.","category":"status","supportsAppend":true,"interactive":false,"defaultSize":{"w":4,"h":4,"minW":3,"minH":3},"configSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"title":{"default":"","title":"Title","type":"string","maxLength":120},"staleAfter":{"default":0,"title":"Mark stale after (seconds)","description":"0 = never. Dims the widget and says Stale when no push arrives in time.","type":"integer","minimum":0,"maximum":86400},"showSummary":{"default":true,"title":"Show summary","type":"boolean"}}},"dataSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"services":{"default":[],"maxItems":50,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","maxLength":60},"status":{"type":"string","enum":["up","degraded","down","unknown","maintenance"]},"detail":{"type":"string","maxLength":120},"updatedAt":{"ui":"hidden","type":"number"}},"required":["name","status"]}}}},"examples":[{"label":"Update one service","body":{"append":{"name":"API","status":"down","detail":"502 from upstream"}}}]},{"type":"indicator","name":"Indicator","description":"One big status light: is the bot running? Is the door open?","category":"status","supportsAppend":false,"interactive":false,"defaultSize":{"w":3,"h":2,"minW":2,"minH":2},"configSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"title":{"default":"","title":"Title","type":"string","maxLength":120},"pulse":{"default":true,"title":"Pulse when up","type":"boolean"},"staleAfter":{"default":0,"title":"Mark stale after (seconds)","description":"0 = never. Great as a heartbeat.","type":"integer","minimum":0,"maximum":86400}}},"dataSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"status":{"default":"unknown","type":"string","enum":["up","degraded","down","unknown","maintenance"]},"label":{"default":"","type":"string","maxLength":80}}},"examples":[{"label":"Heartbeat","body":{"status":"up","label":"Running"}},{"label":"Report a failure","body":{"status":"down","label":"Exchange API unreachable"}}]},{"type":"button","name":"Button","description":"Trigger something: restart a bot, run a job, send a message.","category":"controls","supportsAppend":false,"interactive":true,"defaultSize":{"w":3,"h":2,"minW":2,"minH":2},"configSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"title":{"default":"","title":"Title","type":"string","maxLength":120},"viewersCanUse":{"default":false,"title":"Viewers can use","description":"Otherwise only editors","type":"boolean"},"webhookUrl":{"default":"","title":"Webhook URL","description":"We POST the new value here (https only)","ui":"url","anyOf":[{"type":"string","const":""},{"type":"string","maxLength":2048,"format":"uri"}]},"label":{"default":"Run","title":"Button label","type":"string","minLength":1,"maxLength":40},"tone":{"default":"default","title":"Color","type":"string","enum":["default","success","warning","danger","info"]},"confirm":{"default":false,"title":"Ask for confirmation","type":"boolean"}}},"dataSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"presses":{"default":0,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"lastPressedAt":{"default":null,"type":["number","null"]}}},"examples":[{"label":"Reset counter","body":{"presses":0}}]},{"type":"actions","name":"Action buttons","description":"Several buttons in one panel — restart, deploy, pause, clear cache.","category":"controls","supportsAppend":false,"interactive":true,"defaultSize":{"w":4,"h":3,"minW":2,"minH":3},"configSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"title":{"default":"","title":"Title","type":"string","maxLength":120},"viewersCanUse":{"default":false,"title":"Viewers can use","description":"Otherwise only editors","type":"boolean"},"webhookUrl":{"default":"","title":"Webhook URL","description":"We POST the new value here (https only)","ui":"url","anyOf":[{"type":"string","const":""},{"type":"string","maxLength":2048,"format":"uri"}]},"buttons":{"default":[{"id":"start","label":"Start","tone":"success"},{"id":"stop","label":"Stop","tone":"danger"}],"title":"Buttons","minItems":1,"maxItems":12,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":40,"title":"Id"},"label":{"type":"string","minLength":1,"maxLength":30,"title":"Label"},"tone":{"default":"default","title":"Color","type":"string","enum":["default","success","warning","danger","info"]}},"required":["id","label"]}},"toggles":{"default":[],"title":"Toggles","maxItems":6,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,40}$","title":"State key","description":"The key in data.states"},"label":{"type":"string","minLength":1,"maxLength":30,"title":"Label"},"on":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,40}$","title":"Action id to turn on"},"off":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,40}$","title":"Action id to turn off"},"onText":{"default":"On","title":"On text","type":"string","maxLength":20},"offText":{"default":"Off","title":"Off text","type":"string","maxLength":20},"onTone":{"default":"default","title":"Color when on","description":"danger = being on is bad (e.g. a safety stop)","type":"string","enum":["default","success","warning","danger","info"]}},"required":["id","label","on","off"]}}}},"dataSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"lastAction":{"default":null,"anyOf":[{"type":"string","maxLength":40},{"type":"null"}]},"lastAt":{"default":null,"type":["number","null"]},"counts":{"default":{},"type":"object","propertyNames":{"type":"string","maxLength":40},"additionalProperties":{"type":"integer","minimum":0,"maximum":9007199254740991}},"selected":{"default":null,"anyOf":[{"maxItems":12,"type":"array","items":{"type":"string","maxLength":40}},{"type":"null"}]},"states":{"default":{},"type":"object","propertyNames":{"type":"string","maxLength":40},"additionalProperties":{"type":"boolean"}},"run":{"default":null,"anyOf":[{"type":"object","properties":{"id":{"type":"string","maxLength":40},"status":{"type":"string","enum":["sent","done","failed","confirm","expired"]},"at":{"type":"number"},"by":{"type":"string","maxLength":60},"message":{"type":"string","maxLength":200}},"required":["id","status","at"]},{"type":"null"}]}}},"examples":[{"label":"Reset counters","body":{"counts":{},"lastAction":null,"lastAt":null}}]},{"type":"toggle","name":"Toggle","description":"An on/off switch your script reads — feature flags, pause trading, lights.","category":"controls","supportsAppend":false,"interactive":true,"defaultSize":{"w":3,"h":2,"minW":2,"minH":2},"configSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"title":{"default":"","title":"Title","type":"string","maxLength":120},"viewersCanUse":{"default":false,"title":"Viewers can use","description":"Otherwise only editors","type":"boolean"},"webhookUrl":{"default":"","title":"Webhook URL","description":"We POST the new value here (https only)","ui":"url","anyOf":[{"type":"string","const":""},{"type":"string","maxLength":2048,"format":"uri"}]},"onLabel":{"default":"On","title":"On label","type":"string","maxLength":30},"offLabel":{"default":"Off","title":"Off label","type":"string","maxLength":30},"onTone":{"default":"default","title":"Color when on","description":"danger = being on is bad (e.g. a safety stop)","type":"string","enum":["default","success","warning","danger","info"]}}},"dataSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"on":{"default":false,"type":"boolean"}}},"examples":[{"label":"Turn on","body":{"on":true}}]},{"type":"slider","name":"Slider","description":"Pick a number in a range — thresholds, volume, risk level.","category":"controls","supportsAppend":false,"interactive":true,"defaultSize":{"w":4,"h":2,"minW":2,"minH":2},"configSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"title":{"default":"","title":"Title","type":"string","maxLength":120},"viewersCanUse":{"default":false,"title":"Viewers can use","description":"Otherwise only editors","type":"boolean"},"webhookUrl":{"default":"","title":"Webhook URL","description":"We POST the new value here (https only)","ui":"url","anyOf":[{"type":"string","const":""},{"type":"string","maxLength":2048,"format":"uri"}]},"min":{"default":0,"title":"Min","type":"number"},"max":{"default":100,"title":"Max","type":"number"},"step":{"default":1,"title":"Step","type":"number","exclusiveMinimum":0},"suffix":{"default":"","title":"Suffix","type":"string","maxLength":12}}},"dataSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"value":{"default":50,"type":"number"}}},"examples":[{"label":"Set value","body":{"value":40}}]},{"type":"input","name":"Text input","description":"Send a line of text or a number to your script.","category":"controls","supportsAppend":false,"interactive":true,"defaultSize":{"w":4,"h":2,"minW":2,"minH":2},"configSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"title":{"default":"","title":"Title","type":"string","maxLength":120},"viewersCanUse":{"default":false,"title":"Viewers can use","description":"Otherwise only editors","type":"boolean"},"webhookUrl":{"default":"","title":"Webhook URL","description":"We POST the new value here (https only)","ui":"url","anyOf":[{"type":"string","const":""},{"type":"string","maxLength":2048,"format":"uri"}]},"placeholder":{"default":"Type a value…","title":"Placeholder","type":"string","maxLength":80},"inputType":{"default":"text","title":"Type","type":"string","enum":["text","number"]},"submitLabel":{"default":"Send","title":"Button label","type":"string","maxLength":20}}},"dataSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"value":{"default":"","anyOf":[{"type":"string","maxLength":2000},{"type":"number"}]},"submittedAt":{"default":null,"type":["number","null"]}}},"examples":[{"label":"Set value","body":{"value":"hello"}}]},{"type":"select","name":"Select","description":"Choose one option from a list — mode, environment, strategy.","category":"controls","supportsAppend":false,"interactive":true,"defaultSize":{"w":3,"h":2,"minW":2,"minH":2},"configSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"title":{"default":"","title":"Title","type":"string","maxLength":120},"viewersCanUse":{"default":false,"title":"Viewers can use","description":"Otherwise only editors","type":"boolean"},"webhookUrl":{"default":"","title":"Webhook URL","description":"We POST the new value here (https only)","ui":"url","anyOf":[{"type":"string","const":""},{"type":"string","maxLength":2048,"format":"uri"}]},"options":{"default":["Option A","Option B"],"title":"Options","minItems":1,"maxItems":50,"type":"array","items":{"type":"string","minLength":1,"maxLength":60}},"style":{"default":"buttons","title":"Style","type":"string","enum":["dropdown","buttons"]}}},"dataSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"value":{"default":"","type":"string","maxLength":60}}},"examples":[{"label":"Select an option","body":{"value":"Aggressive"}}]},{"type":"markdown","name":"Text","description":"Headings, notes and links, written in Markdown.","category":"content","supportsAppend":false,"interactive":false,"defaultSize":{"w":4,"h":3,"minW":2,"minH":2},"configSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"title":{"default":"","title":"Title","type":"string","maxLength":120},"align":{"default":"left","title":"Alignment","type":"string","enum":["left","center"]},"size":{"default":"md","title":"Text size","type":"string","enum":["sm","md","lg"]}}},"dataSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"text":{"default":"","ui":"textarea","title":"Markdown","type":"string","maxLength":20000}}},"examples":[{"label":"Replace text","body":{"text":"# Deploy status\nAll green ✅"}}]},{"type":"accordion","name":"FAQ / accordion","description":"Questions and answers that expand on click — runbooks, FAQs, notes.","category":"content","supportsAppend":true,"interactive":false,"defaultSize":{"w":4,"h":4,"minW":2,"minH":2},"configSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"title":{"default":"","title":"Title","type":"string","maxLength":120},"openFirst":{"default":true,"title":"Open the first item","type":"boolean"}}},"dataSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"items":{"default":[],"maxItems":50,"type":"array","items":{"type":"object","properties":{"q":{"type":"string","minLength":1,"maxLength":200,"title":"Question"},"a":{"type":"string","maxLength":4000,"title":"Answer"}},"required":["q","a"]}}}},"examples":[{"label":"Add an item","body":{"append":{"q":"Who owns this board?","a":"The platform team."}}}]},{"type":"image","name":"Image","description":"Show an image or a camera snapshot that refreshes on a timer.","category":"content","supportsAppend":false,"interactive":false,"defaultSize":{"w":4,"h":4,"minW":2,"minH":2},"configSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"title":{"default":"","title":"Title","type":"string","maxLength":120},"fit":{"default":"cover","title":"Fit","type":"string","enum":["cover","contain"]},"refreshSeconds":{"default":0,"title":"Refresh every (seconds)","description":"0 = off","type":"integer","minimum":0,"maximum":86400},"alt":{"default":"","title":"Alt text","type":"string","maxLength":200}}},"dataSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"url":{"default":"","ui":"url","title":"Image URL","anyOf":[{"type":"string","const":""},{"type":"string","maxLength":2048,"format":"uri"}]}}},"examples":[{"label":"Change image","body":{"url":"https://example.com/cam.jpg"}}]},{"type":"embed","name":"Embed","description":"Embed a web page, video or form (YouTube, Google Docs, Loom…).","category":"content","supportsAppend":false,"interactive":false,"defaultSize":{"w":6,"h":5,"minW":3,"minH":3},"configSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"title":{"default":"","title":"Title","type":"string","maxLength":120}}},"dataSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"url":{"default":"","ui":"url","title":"Page URL","anyOf":[{"type":"string","const":""},{"type":"string","maxLength":2048,"format":"uri"}]}}},"examples":[{"label":"Change URL","body":{"url":"https://example.com"}}]},{"type":"clock","name":"Clock","description":"Current time in any time zone.","category":"time","supportsAppend":false,"interactive":false,"defaultSize":{"w":3,"h":2,"minW":2,"minH":2},"configSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"title":{"default":"","title":"Title","type":"string","maxLength":120},"timeZone":{"default":"","title":"Time zone","description":"e.g. Asia/Jerusalem. Empty = viewer's","type":"string","maxLength":60},"hour12":{"default":false,"title":"12-hour","type":"boolean"},"showSeconds":{"default":true,"title":"Seconds","type":"boolean"},"showDate":{"default":true,"title":"Date","type":"boolean"}}},"dataSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{}},"examples":[]},{"type":"countdown","name":"Countdown","description":"Days, hours and minutes until a launch, deadline or event.","category":"time","supportsAppend":false,"interactive":false,"defaultSize":{"w":4,"h":2,"minW":3,"minH":2},"configSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"title":{"default":"","title":"Title","type":"string","maxLength":120},"doneText":{"default":"It's time! 🎉","title":"Text when finished","type":"string","maxLength":80}}},"dataSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"target":{"default":"","ui":"datetime","title":"Target date & time","type":"string","maxLength":40}}},"examples":[{"label":"Set target","body":{"target":"2026-12-31T23:59:00Z"}}]}]}