Config-driven channel overlays. Every widget is a self-contained page that reads its
settings from URL query parameters and renders on a transparent background over the channel video.
Host this widgets/ folder on a public https host; put a widget's URL (with its params)
into a channel's Webpage widget, or use it as its own channel. Every widget takes
chrome=glass|solid|shadow|brand and accent=%23RRGGBB.
Airgapped time (the TIME group on time widgets): they never trust the
renderer's own clock zone. Set base=2026-06-01T20:45 to feed the time manually (the box
clock is ignored and ticks on from there), or offset=%2B1:00 to shift the box clock by
±H:MM. A clock zone can be a fixed offset (London|%2B1) so no timezone database is needed
at all — everything works with no network.
Live data & keys. Weather and FX need no key. The travel / sport / news / ops
widgets take their API key and endpoint as params (apikey=, station=,
data=…) and show a realistic sample until a key is entered — so every widget can be
uploaded and channelled now and simply goes live once its key arrives.
clock.htmlParams — face=digital|stack|analogue|roman|minimal|flip · zones=London,New York,Tokyo (also Label|Area/Zone or Label|±H:MM fixed offset) · h12 · secs · TIME · chrome · accent
Example — clock.html?face=analogue&zones=London,New York,Tokyo
countdown.htmlParams — title · to=ISO datetime (venue time) · zero=label at 0 · TIME · chrome · accent
Example — countdown.html?title=KICK-OFF&to=2026-12-31T20:00
kitchen.htmlParams — label · close=HH:MM · open=HH:MM · warn=mins (amber, def 15) · closed=text · TIME · chrome
Example — kitchen.html?label=Kitchen&close=21:00&base=2026-06-01T20:50
now-next.htmlParams — now, next as HH:MM|Title · or items= JSON · heading · TIME · chrome
Example — now-next.html?chrome=solid
datebar.htmlParams — title (override greeting) · TIME (tz/base/offset) · chrome · accent
Example — datebar.html?chrome=glass
weather.htmlParams — place · lat · lon · f (°F) · variant=chip|panel · stale=stamp|fade|hide · chrome
Example — weather.html?place=Birmingham&lat=52.48&lon=-1.9
matchday-forecast.htmlParams — lat · lon · place · kickoff=HH:MM · hours=6 · f (°F) · chrome — live Open-Meteo (no key)
Example — matchday-forecast.html?place=Birmingham&lat=52.48&lon=-1.9&kickoff=15:00&chrome=solid
air-quality.htmlParams — lat · lon · place · chrome — live Open-Meteo air-quality (no key)
Example — air-quality.html?place=Birmingham&lat=52.48&lon=-1.9&chrome=glass
pitch-conditions.htmlParams — lat · lon · title · surface= JSON [{k,v,tone}] · chrome — live Open-Meteo (no key)
Example — pitch-conditions.html?title=Pitch%20conditions&lat=52.48&lon=-1.9&chrome=solid
rail-departures.htmlParams — station=CRS (e.g. BHM) · rows=6 · apikey= (National Rail Darwin) · title · chrome
Example — rail-departures.html?station=BHM&title=New%20Street%20departures&chrome=solid
flight-departures.htmlParams — airport=IATA (e.g. BHX) · rows=6 · apikey= (AeroDataBox) · title · chrome
Example — flight-departures.html?airport=BHX&title=Birmingham%20departures&chrome=solid
line-status.htmlParams — lines=victoria,central,… (TfL ids) · title · apikey= (optional TfL app key) · chrome
Example — line-status.html?title=Tube%20status&chrome=glass
road-times.htmlParams — routes= JSON [{name,mins,delta,tone}] · title · apikey= (TomTom) · chrome
Example — road-times.html?title=Egress%20routes&routes=%5B%7B%22name%22%3A%22M6%20J6%20north%22%2C%22mins%22%3A14%2C%22delta%22%3A6%7D%5D&chrome=solid
getting-home.htmlParams — title · trains= JSON [{time,dest,note,tone}] · trams=text · roads= JSON · apikey= · chrome
Example — getting-home.html?title=Getting%20home&chrome=brand
score-bug.htmlParams — home=ARS · away=CHE · hs · as · hc=#hex · ac=#hex · clock=67min · comp · apikey= · chrome
Example — score-bug.html?home=ARS&away=CHE&hs=2&as=1&hc=%23EF0107&ac=%23034694&clock=67'&chrome=solid
vidiprinter.htmlParams — items= JSON [{min,text}] · speed=55 · apikey= (football-data) · chrome
Example — vidiprinter.html?chrome=solid
league-table.htmlParams — rows= JSON [{pos,team,pl,gd,pts,home}] · title · comp=PL · apikey= (football-data) · chrome
Example — league-table.html?title=Premier%20League&chrome=solid
starting-xi.htmlParams — formation=4-3-3 · players= JSON [11 names] · color=#hex · title · apikey= (API-Football) · chrome
Example — starting-xi.html?title=Arsenal%20XI&formation=4-3-3&color=%23EF0107&chrome=solid
next-race.htmlParams — course · off=HH:MM · runners= JSON [{no,name,jockey,price}] · apikey= (Racing API) · chrome
Example — next-race.html?course=Ascot&off=15:40&chrome=solid
match-odds.htmlParams — title · sel= JSON [{name,price,drift}] · book= · aware=1 (18+ line) · apikey= (Odds API) · chrome
Example — match-odds.html?title=Arsenal%20v%20Chelsea&book=Sky%20Bet&chrome=solid
fixtures-tower.htmlParams — title · items= JSON [{time,name}] · now= index of current · chrome
Example — fixtures-tower.html?title=Today&now=2&chrome=glass
menuboard.htmlParams — title · menu= JSON [{section,name,desc,price,was,out}] · hh= happy-hour · chrome
Example — menuboard.html?chrome=solid
welcome.htmlParams — title · name · sub · logo= image URL · chrome
Example — welcome.html?name=Acme%20Ltd&sub=Boardroom%202%20%C2%B7%2014:00&chrome=brand
sponsor-rotator.htmlParams — logos= JSON [image URLs] · dwell=6 · prefix= caption · chrome
Example — sponsor-rotator.html?chrome=glass
announce.htmlParams — kick=flag label · msg=message · chrome · accent
Example — announce.html?kick=Travel&msg=Last%20train%20New%20Street%2023:42&chrome=solid
ops-notices.htmlParams — heading · items= JSON [{text,level}] (info|warn|alert) · or line1..line4 · chrome
Example — ops-notices.html?chrome=solid
tap-list.htmlParams — title · items= JSON [{tap,beer,brewery,abv,out}] · fresh= index just-tapped · chrome
Example — tap-list.html?title=On%20tap&chrome=solid
meeting-room.htmlParams — room · now= JSON {title,until} · next= JSON {title,at} · apikey= (M365/Google) · chrome
Example — meeting-room.html?room=Boardroom%202&chrome=brand
qr-cta.htmlParams — label (≤5 words) · sub · img= (QR image URL/data) · chrome — QR image supplied by the app
Example — qr-cta.html?label=Order%20to%20seat&sub=Scan%20to%20order&chrome=glass
next-event.htmlParams — name · when=ISO · sub · art=#hex duotone · apikey= (Ticketmaster) · chrome
Example — next-event.html?name=The%20National&when=2026-09-14T19:30&sub=Doors%2018:00&art=%237B4BF0&chrome=solid
queue-times.htmlParams — title · items= JSON [{name,mins}] · warnAt=5 · badAt=12 · feed= · chrome
Example — queue-times.html?title=Queue%20times&chrome=solid
reviews.htmlParams — items= JSON [{stars,text,name}] · dwell=7 · apikey= (Google Places) · chrome
Example — reviews.html?chrome=glass
markets.htmlParams — base=GBP · symbols=USD,EUR,JPY · label · speed · refresh · chrome — live Frankfurter (no key)
Example — markets.html?base=GBP&symbols=USD,EUR,JPY&chrome=solid
ticker.htmlParams — src= flag label · items= JSON · or text= · chrome
Example — ticker.html?src=VENUE&chrome=solid
headlines.htmlParams — source=BBC · items= JSON [texts] · dwell=6 · feed= (RSS→JSON url) · apikey= · chrome
Example — headlines.html?source=BBC%20News&chrome=solid
news-crawl.htmlParams — items= JSON [texts] · sep=• · speed=60 (px/s) · feed= (RSS→JSON) · source= chip · chrome
Example — news-crawl.html?source=NEWS&chrome=solid
server-stats.htmlParams — data= JSON {cpu,mem,temp,playouts,uptime} (Jaff maestro-appliances-request) · title · chrome
Example — server-stats.html?title=Core%20server&chrome=solid
net-monitor.htmlParams — data= JSON [{name,down,up,hist:[…]}] (needs server net counters) · title · chrome
Example — net-monitor.html?title=STB%20network&chrome=solid
fleet-status.htmlParams — data= JSON {ok,warn,bad,on,total,worst:[…]} (Jaff conductor-assets-request) · title · chrome
Example — fleet-status.html?title=Fleet%20status&chrome=solid
zone-health.htmlParams — data= JSON [{name,tone}] (Jaff conductor-locations-request) · title · chrome
Example — zone-health.html?title=Zone%20health&chrome=glass
encoder-load.htmlParams — data= JSON [{host,in,out,head}] (Jaff vivo-portals-request) · title · chrome
Example — encoder-load.html?title=Encoder%20load&chrome=solid
bitrate-gauge.htmlParams — data= JSON {mbps,max,hist:[…]} (Jaff vivo-outputs stats) · channel= · chrome
Example — bitrate-gauge.html?channel=Ch%20233&chrome=solid
device-card.htmlParams — data= JSON {name,model,firmware,ip,mac,uptime,seen} (Jaff conductor-assets-request) · chrome
Example — device-card.html?chrome=solid
input-monitor.htmlParams — data= JSON [{name,health,sync,queue}] (Jaff vivo-inputs-request) · title · chrome
Example — input-monitor.html?title=Head-end%20inputs&chrome=solid
automation-ticker.htmlParams — data= JSON {next:{name,at},last:{name,ok}} (Jaff maestro-manuscript-request) · chrome
Example — automation-ticker.html?chrome=solid