[{"data":1,"prerenderedAt":8125},["ShallowReactive",2],{"docs-en":3},[4,900,1442,1846,2211,2423,2760,3104,3525,4084,4384,4641,5494,6046,6615,7665],{"id":5,"title":6,"author":7,"body":8,"date":7,"description":892,"extension":893,"meta":894,"navigation":895,"path":896,"robots":7,"seo":897,"stem":898,"tags":7,"__hash__":899},"content_en\u002Fdocs\u002Fconfiguration.md","Configuration Reference",null,{"type":9,"value":10,"toc":880},"minimark",[11,15,24,72,77,145,149,206,210,339,343,396,403,407,469,473,511,515,555,559,562,625,629,665,669,876],[12,13,6],"h1",{"id":14},"configuration-reference",[16,17,18,19,23],"p",{},"All players read configuration from a ",[20,21,22],"code",{},"config.json"," file. The location varies by platform:",[25,26,27,40],"table",{},[28,29,30],"thead",{},[31,32,33,37],"tr",{},[34,35,36],"th",{},"Platform",[34,38,39],{},"Config path",[41,42,43,54,64],"tbody",{},[31,44,45,49],{},[46,47,48],"td",{},"Electron",[46,50,51],{},[20,52,53],{},"~\u002F.config\u002Fxiboplayer\u002Felectron\u002Fconfig.json",[31,55,56,59],{},[46,57,58],{},"Chromium",[46,60,61],{},[20,62,63],{},"~\u002F.config\u002Fxiboplayer\u002Fchromium\u002Fconfig.json",[31,65,66,69],{},[46,67,68],{},"PWA",[46,70,71],{},"Stored in browser localStorage",[73,74,76],"h2",{"id":75},"connection-settings","Connection settings",[25,78,79,92],{},[28,80,81],{},[31,82,83,86,89],{},[34,84,85],{},"Key",[34,87,88],{},"Default",[34,90,91],{},"Description",[41,93,94,107,119,132],{},[31,95,96,101,104],{},[46,97,98],{},[20,99,100],{},"cmsUrl",[46,102,103],{},"—",[46,105,106],{},"CMS server URL (required)",[31,108,109,114,116],{},[46,110,111],{},[20,112,113],{},"cmsKey",[46,115,103],{},[46,117,118],{},"CMS secret key (required)",[31,120,121,126,129],{},[46,122,123],{},[20,124,125],{},"displayName",[46,127,128],{},"hostname",[46,130,131],{},"Display name shown in CMS",[31,133,134,139,142],{},[46,135,136],{},[20,137,138],{},"hardwareKey",[46,140,141],{},"auto-generated",[46,143,144],{},"Unique display identifier (do not change)",[73,146,148],{"id":147},"server-settings","Server settings",[25,150,151,165],{},[28,152,153],{},[31,154,155,157,159,161,163],{},[34,156,85],{},[34,158,88],{},[34,160,48],{},[34,162,58],{},[34,164,91],{},[41,166,167,186],{},[31,168,169,174,177,180,183],{},[46,170,171],{},[20,172,173],{},"serverPort",[46,175,176],{},"8765 \u002F 8766",[46,178,179],{},"8765",[46,181,182],{},"8766",[46,184,185],{},"Local proxy server port",[31,187,188,193,198,201,203],{},[46,189,190],{},[20,191,192],{},"relaxSslCerts",[46,194,195],{},[20,196,197],{},"false",[46,199,200],{},"Yes",[46,202,200],{},[46,204,205],{},"Accept self-signed CMS certificates",[73,207,209],{"id":208},"display-settings","Display settings",[25,211,212,226],{},[28,213,214],{},[31,215,216,218,220,222,224],{},[34,217,85],{},[34,219,88],{},[34,221,48],{},[34,223,58],{},[34,225,91],{},[41,227,228,247,265,283,301,320],{},[31,229,230,235,240,242,244],{},[46,231,232],{},[20,233,234],{},"kioskMode",[46,236,237],{},[20,238,239],{},"true",[46,241,200],{},[46,243,200],{},[46,245,246],{},"Fullscreen kiosk mode",[31,248,249,254,258,260,262],{},[46,250,251],{},[20,252,253],{},"fullscreen",[46,255,256],{},[20,257,239],{},[46,259,200],{},[46,261,200],{},[46,263,264],{},"Start in fullscreen",[31,266,267,272,276,278,280],{},[46,268,269],{},[20,270,271],{},"hideMouseCursor",[46,273,274],{},[20,275,239],{},[46,277,200],{},[46,279,200],{},[46,281,282],{},"Auto-hide cursor after inactivity",[31,284,285,290,294,296,298],{},[46,286,287],{},[20,288,289],{},"preventSleep",[46,291,292],{},[20,293,239],{},[46,295,200],{},[46,297,200],{},[46,299,300],{},"Prevent screen blanking",[31,302,303,308,313,315,317],{},[46,304,305],{},[20,306,307],{},"width",[46,309,310],{},[20,311,312],{},"1920",[46,314,103],{},[46,316,200],{},[46,318,319],{},"Window width (non-kiosk mode)",[31,321,322,327,332,334,336],{},[46,323,324],{},[20,325,326],{},"height",[46,328,329],{},[20,330,331],{},"1080",[46,333,103],{},[46,335,200],{},[46,337,338],{},"Window height (non-kiosk mode)",[73,340,342],{"id":341},"gpu-settings","GPU settings",[25,344,345,359],{},[28,346,347],{},[31,348,349,351,353,355,357],{},[34,350,85],{},[34,352,88],{},[34,354,48],{},[34,356,58],{},[34,358,91],{},[41,360,361],{},[31,362,363,368,373,375,377],{},[46,364,365],{},[20,366,367],{},"gpu",[46,369,370],{},[20,371,372],{},"auto",[46,374,200],{},[46,376,200],{},[46,378,379,380,382,383,382,386,382,389,392,393],{},"GPU selection: ",[20,381,372],{},", ",[20,384,385],{},"nvidia",[20,387,388],{},"intel",[20,390,391],{},"amd",", or ",[20,394,395],{},"\u002Fdev\u002Fdri\u002FrenderDNNN",[16,397,398,399,402],{},"The player auto-detects GPUs via ",[20,400,401],{},"\u002Fsys\u002Fclass\u002Fdrm"," and selects the best one. On hybrid GPU systems (Optimus\u002FPRIME), it prefers the GPU with display connectors.",[73,404,406],{"id":405},"sync-settings-video-walls","Sync settings (video walls)",[25,408,409,419],{},[28,410,411],{},[31,412,413,415,417],{},[34,414,85],{},[34,416,88],{},[34,418,91],{},[41,420,421,435,457],{},[31,422,423,428,432],{},[46,424,425],{},[20,426,427],{},"sync.enabled",[46,429,430],{},[20,431,197],{},[46,433,434],{},"Enable multi-display synchronization",[31,436,437,442,446],{},[46,438,439],{},[20,440,441],{},"sync.role",[46,443,444],{},[20,445,372],{},[46,447,448,382,451,392,454,456],{},[20,449,450],{},"lead",[20,452,453],{},"follower",[20,455,372],{}," (mDNS discovery)",[31,458,459,464,466],{},[46,460,461],{},[20,462,463],{},"sync.leadUrl",[46,465,103],{},[46,467,468],{},"WebSocket URL of the lead display (manual mode)",[73,470,472],{"id":471},"api-settings","API settings",[25,474,475,485],{},[28,476,477],{},[31,478,479,481,483],{},[34,480,85],{},[34,482,88],{},[34,484,91],{},[41,486,487,499],{},[31,488,489,494,496],{},[46,490,491],{},[20,492,493],{},"apiClientId",[46,495,103],{},[46,497,498],{},"OAuth2 client ID for REST API",[31,500,501,506,508],{},[46,502,503],{},[20,504,505],{},"apiClientSecret",[46,507,103],{},[46,509,510],{},"OAuth2 client secret for REST API",[73,512,514],{"id":513},"logging","Logging",[25,516,517,527],{},[28,518,519],{},[31,520,521,523,525],{},[34,522,85],{},[34,524,88],{},[34,526,91],{},[41,528,529],{},[31,530,531,536,541],{},[46,532,533],{},[20,534,535],{},"logLevel",[46,537,538],{},[20,539,540],{},"warning",[46,542,543,544,382,547,382,550,382,552],{},"Log level: ",[20,545,546],{},"debug",[20,548,549],{},"info",[20,551,540],{},[20,553,554],{},"error",[73,556,558],{"id":557},"keyboard-shortcuts","Keyboard shortcuts",[16,560,561],{},"These work in all player platforms:",[25,563,564,573],{},[28,565,566],{},[31,567,568,570],{},[34,569,85],{},[34,571,572],{},"Action",[41,574,575,585,595,605,615],{},[31,576,577,582],{},[46,578,579],{},[20,580,581],{},"D",[46,583,584],{},"Toggle download overlay (shows download progress)",[31,586,587,592],{},[46,588,589],{},[20,590,591],{},"T",[46,593,594],{},"Toggle timeline overlay (shows schedule)",[31,596,597,602],{},[46,598,599],{},[20,600,601],{},"S",[46,603,604],{},"Toggle setup overlay (CMS configuration)",[31,606,607,612],{},[46,608,609],{},[20,610,611],{},"Ctrl+I",[46,613,614],{},"Show status (IP, CMS, player — kiosk only)",[31,616,617,622],{},[46,618,619],{},[20,620,621],{},"Ctrl+R",[46,623,624],{},"Reconfigure CMS (kiosk only)",[73,626,628],{"id":627},"environment-variables","Environment variables",[25,630,631,640],{},[28,632,633],{},[31,634,635,638],{},[34,636,637],{},"Variable",[34,639,91],{},[41,641,642,652],{},[31,643,644,649],{},[46,645,646],{},[20,647,648],{},"XIBOPLAYER_DEBUG_PORT",[46,650,651],{},"Enable Chrome DevTools Protocol on this port (e.g., 9223)",[31,653,654,659],{},[46,655,656],{},[20,657,658],{},"XIBO_GPU",[46,660,661,662,664],{},"Override GPU selection (same values as ",[20,663,367],{}," config key)",[73,666,668],{"id":667},"example-configjson","Example config.json",[670,671,676],"pre",{"className":672,"code":673,"language":674,"meta":675,"style":675},"language-json shiki shiki-themes material-theme-lighter github-light github-dark","{\n  \"cmsUrl\": \"https:\u002F\u002Fcms.example.com\",\n  \"cmsKey\": \"your-secret-key\",\n  \"displayName\": \"Lobby Display\",\n  \"serverPort\": 8765,\n  \"gpu\": \"auto\",\n  \"logLevel\": \"info\",\n  \"sync\": {\n    \"enabled\": true,\n    \"role\": \"auto\"\n  }\n}\n","json","",[20,677,678,687,716,736,756,773,792,811,826,845,864,870],{"__ignoreMap":675},[679,680,683],"span",{"class":681,"line":682},"line",1,[679,684,686],{"class":685},"sP7_E","{\n",[679,688,690,694,697,700,703,707,711,713],{"class":681,"line":689},2,[679,691,693],{"class":692},"s39Yj","  \"",[679,695,100],{"class":696},"sseR_",[679,698,699],{"class":692},"\"",[679,701,702],{"class":685},":",[679,704,706],{"class":705},"sjJ54"," \"",[679,708,710],{"class":709},"s_sjI","https:\u002F\u002Fcms.example.com",[679,712,699],{"class":705},[679,714,715],{"class":685},",\n",[679,717,719,721,723,725,727,729,732,734],{"class":681,"line":718},3,[679,720,693],{"class":692},[679,722,113],{"class":696},[679,724,699],{"class":692},[679,726,702],{"class":685},[679,728,706],{"class":705},[679,730,731],{"class":709},"your-secret-key",[679,733,699],{"class":705},[679,735,715],{"class":685},[679,737,739,741,743,745,747,749,752,754],{"class":681,"line":738},4,[679,740,693],{"class":692},[679,742,125],{"class":696},[679,744,699],{"class":692},[679,746,702],{"class":685},[679,748,706],{"class":705},[679,750,751],{"class":709},"Lobby Display",[679,753,699],{"class":705},[679,755,715],{"class":685},[679,757,759,761,763,765,767,771],{"class":681,"line":758},5,[679,760,693],{"class":692},[679,762,173],{"class":696},[679,764,699],{"class":692},[679,766,702],{"class":685},[679,768,770],{"class":769},"srdBf"," 8765",[679,772,715],{"class":685},[679,774,776,778,780,782,784,786,788,790],{"class":681,"line":775},6,[679,777,693],{"class":692},[679,779,367],{"class":696},[679,781,699],{"class":692},[679,783,702],{"class":685},[679,785,706],{"class":705},[679,787,372],{"class":709},[679,789,699],{"class":705},[679,791,715],{"class":685},[679,793,795,797,799,801,803,805,807,809],{"class":681,"line":794},7,[679,796,693],{"class":692},[679,798,535],{"class":696},[679,800,699],{"class":692},[679,802,702],{"class":685},[679,804,706],{"class":705},[679,806,549],{"class":709},[679,808,699],{"class":705},[679,810,715],{"class":685},[679,812,814,816,819,821,823],{"class":681,"line":813},8,[679,815,693],{"class":692},[679,817,818],{"class":696},"sync",[679,820,699],{"class":692},[679,822,702],{"class":685},[679,824,825],{"class":685}," {\n",[679,827,829,832,836,838,840,843],{"class":681,"line":828},9,[679,830,831],{"class":692},"    \"",[679,833,835],{"class":834},"sZMiF","enabled",[679,837,699],{"class":692},[679,839,702],{"class":685},[679,841,842],{"class":692}," true",[679,844,715],{"class":685},[679,846,848,850,853,855,857,859,861],{"class":681,"line":847},10,[679,849,831],{"class":692},[679,851,852],{"class":834},"role",[679,854,699],{"class":692},[679,856,702],{"class":685},[679,858,706],{"class":705},[679,860,372],{"class":709},[679,862,863],{"class":705},"\"\n",[679,865,867],{"class":681,"line":866},11,[679,868,869],{"class":685},"  }\n",[679,871,873],{"class":681,"line":872},12,[679,874,875],{"class":685},"}\n",[877,878,879],"style",{},"html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sseR_, html code.shiki .sseR_{--shiki-light:#9C3EDA;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZMiF, html code.shiki .sZMiF{--shiki-light:#E2931D;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":675,"searchDepth":718,"depth":718,"links":881},[882,883,884,885,886,887,888,889,890,891],{"id":75,"depth":689,"text":76},{"id":147,"depth":689,"text":148},{"id":208,"depth":689,"text":209},{"id":341,"depth":689,"text":342},{"id":405,"depth":689,"text":406},{"id":471,"depth":689,"text":472},{"id":513,"depth":689,"text":514},{"id":557,"depth":689,"text":558},{"id":627,"depth":689,"text":628},{"id":667,"depth":689,"text":668},"Complete configuration reference for all xiboplayer platforms","md",{"order":682},true,"\u002Fdocs\u002Fconfiguration",{"title":6,"description":892},"docs\u002Fconfiguration","dmMksaBtUeetLKIXlwgItR3sGZN7nkgCp25OQfcQrJQ",{"id":901,"title":902,"author":7,"body":903,"date":7,"description":1436,"extension":893,"meta":1437,"navigation":895,"path":1438,"robots":7,"seo":1439,"stem":1440,"tags":7,"__hash__":1441},"content_en\u002Fdocs\u002Fdeployment\u002Fself-hosted.md","Self-Hosted Deployment",{"type":9,"value":904,"toc":1419},[905,908,911,915,920,931,958,993,996,1000,1013,1017,1028,1039,1043,1047,1123,1127,1130,1183,1187,1195,1199,1258,1261,1265,1272,1286,1289,1293,1302,1310,1313,1317,1357,1360,1364,1416],[12,906,902],{"id":907},"self-hosted-deployment",[16,909,910],{},"Deploy xiboplayer with a self-hosted Xibo CMS.",[73,912,914],{"id":913},"cms-options","CMS options",[916,917,919],"h3",{"id":918},"recommended-xibo-cms-fork-docker","Recommended: xibo-cms fork (Docker)",[16,921,922,923,930],{},"Our ",[924,925,929],"a",{"href":926,"rel":927},"https:\u002F\u002Fgithub.com\u002Fxibo-players\u002Fxibo-cms",[928],"nofollow","xibo-cms fork"," is rebased daily on upstream — you get all upstream features, bug fixes, and security patches without delay. On top of that, the fork adds:",[932,933,934,942,948],"ul",{},[935,936,937,941],"li",{},[938,939,940],"strong",{},"REST API v2"," — JWT auth, ETag caching, ~30% smaller payloads than SOAP",[935,943,944,947],{},[938,945,946],{},"PWA player built into the CMS"," — no separate deployment needed",[935,949,950,957],{},[938,951,952,953,956],{},"No ",[20,954,955],{},"ext-soap"," required"," — the #1 reason upstream CMS Docker deployments fail",[670,959,963],{"className":960,"code":961,"language":962,"meta":675,"style":675},"language-bash shiki shiki-themes material-theme-lighter github-light github-dark","# Pull and run our CMS fork\ndocker compose -f docker-compose.yml up -d\n","bash",[20,964,965,971],{"__ignoreMap":675},[679,966,967],{"class":681,"line":682},[679,968,970],{"class":969},"sutJx","# Pull and run our CMS fork\n",[679,972,973,977,980,984,987,990],{"class":681,"line":689},[679,974,976],{"class":975},"sbgvK","docker",[679,978,979],{"class":709}," compose",[679,981,983],{"class":982},"stzsN"," -f",[679,985,986],{"class":709}," docker-compose.yml",[679,988,989],{"class":709}," up",[679,991,992],{"class":982}," -d\n",[16,994,995],{},"The player auto-detects which transport the CMS supports and uses the best one available. Works with both our fork and upstream Xibo CMS.",[916,997,999],{"id":998},"alternative-upstream-xibo-cms","Alternative: upstream Xibo CMS",[16,1001,1002,1003,1006,1007,1012],{},"Any ",[938,1004,1005],{},"Xibo CMS v3 or v4"," works. Follow the ",[924,1008,1011],{"href":1009,"rel":1010},"https:\u002F\u002Fxibosignage.com\u002Fdocs\u002Fsetup\u002Fcms-installation",[928],"official installation guide",". The player falls back to SOAP when REST is unavailable.",[916,1014,1016],{"id":1015},"requirements","Requirements",[932,1018,1019,1022,1025],{},[935,1020,1021],{},"Docker + Docker Compose",[935,1023,1024],{},"2GB+ RAM, 20GB+ storage",[935,1026,1027],{},"A domain name with HTTPS (required for PWA, recommended for all)",[16,1029,1030,1031,1034,1035,1038],{},"After setup, note your ",[938,1032,1033],{},"CMS URL"," and ",[938,1036,1037],{},"CMS Secret Key"," (Settings → Display Settings).",[73,1040,1042],{"id":1041},"player-installation","Player installation",[916,1044,1046],{"id":1045},"rpmdeb-packages","RPM\u002FDEB packages",[670,1048,1050],{"className":960,"code":1049,"language":962,"meta":675,"style":675},"# Add the xiboplayer repository\nsudo dnf install https:\u002F\u002Fdl.xiboplayer.org\u002Frpm\u002Ffedora\u002F43\u002Fnoarch\u002Fxiboplayer-release-43-7.fc43.noarch.rpm\n\n# Install your preferred player\nsudo dnf install xiboplayer-electron    # Full-featured, bundles Chromium\nsudo dnf install xiboplayer-chromium    # Lightweight, uses system browser\nsudo dnf install xiboplayer-kiosk       # Auto-start kiosk meta-package\n",[20,1051,1052,1057,1071,1076,1081,1095,1109],{"__ignoreMap":675},[679,1053,1054],{"class":681,"line":682},[679,1055,1056],{"class":969},"# Add the xiboplayer repository\n",[679,1058,1059,1062,1065,1068],{"class":681,"line":689},[679,1060,1061],{"class":975},"sudo",[679,1063,1064],{"class":709}," dnf",[679,1066,1067],{"class":709}," install",[679,1069,1070],{"class":709}," https:\u002F\u002Fdl.xiboplayer.org\u002Frpm\u002Ffedora\u002F43\u002Fnoarch\u002Fxiboplayer-release-43-7.fc43.noarch.rpm\n",[679,1072,1073],{"class":681,"line":718},[679,1074,1075],{"emptyLinePlaceholder":895},"\n",[679,1077,1078],{"class":681,"line":738},[679,1079,1080],{"class":969},"# Install your preferred player\n",[679,1082,1083,1085,1087,1089,1092],{"class":681,"line":758},[679,1084,1061],{"class":975},[679,1086,1064],{"class":709},[679,1088,1067],{"class":709},[679,1090,1091],{"class":709}," xiboplayer-electron",[679,1093,1094],{"class":969},"    # Full-featured, bundles Chromium\n",[679,1096,1097,1099,1101,1103,1106],{"class":681,"line":775},[679,1098,1061],{"class":975},[679,1100,1064],{"class":709},[679,1102,1067],{"class":709},[679,1104,1105],{"class":709}," xiboplayer-chromium",[679,1107,1108],{"class":969},"    # Lightweight, uses system browser\n",[679,1110,1111,1113,1115,1117,1120],{"class":681,"line":794},[679,1112,1061],{"class":975},[679,1114,1064],{"class":709},[679,1116,1067],{"class":709},[679,1118,1119],{"class":709}," xiboplayer-kiosk",[679,1121,1122],{"class":969},"       # Auto-start kiosk meta-package\n",[916,1124,1126],{"id":1125},"pwa-browser-based","PWA (browser-based)",[16,1128,1129],{},"The PWA must be served from the same domain as the CMS:",[670,1131,1133],{"className":960,"code":1132,"language":962,"meta":675,"style":675},"git clone https:\u002F\u002Fgithub.com\u002Fxibo-players\u002Fxiboplayer.git\ncd xiboplayer && pnpm install\npnpm --filter @xiboplayer\u002Fpwa build\n# Deploy dist\u002F to your CMS web root\n",[20,1134,1135,1146,1164,1178],{"__ignoreMap":675},[679,1136,1137,1140,1143],{"class":681,"line":682},[679,1138,1139],{"class":975},"git",[679,1141,1142],{"class":709}," clone",[679,1144,1145],{"class":709}," https:\u002F\u002Fgithub.com\u002Fxibo-players\u002Fxiboplayer.git\n",[679,1147,1148,1152,1155,1158,1161],{"class":681,"line":689},[679,1149,1151],{"class":1150},"sptTA","cd",[679,1153,1154],{"class":709}," xiboplayer",[679,1156,1157],{"class":685}," &&",[679,1159,1160],{"class":975}," pnpm",[679,1162,1163],{"class":709}," install\n",[679,1165,1166,1169,1172,1175],{"class":681,"line":718},[679,1167,1168],{"class":975},"pnpm",[679,1170,1171],{"class":982}," --filter",[679,1173,1174],{"class":709}," @xiboplayer\u002Fpwa",[679,1176,1177],{"class":709}," build\n",[679,1179,1180],{"class":681,"line":738},[679,1181,1182],{"class":969},"# Deploy dist\u002F to your CMS web root\n",[916,1184,1186],{"id":1185},"kiosk-image","Kiosk image",[16,1188,1189,1190,1194],{},"Download a pre-built ISO from ",[924,1191,1193],{"href":1192},"\u002Fdownloads","Downloads",". Flash to USB\u002FSD, boot, and the player auto-starts.",[73,1196,1198],{"id":1197},"network-requirements","Network requirements",[25,1200,1201,1214],{},[28,1202,1203],{},[31,1204,1205,1208,1211],{},[34,1206,1207],{},"Port",[34,1209,1210],{},"Protocol",[34,1212,1213],{},"Purpose",[41,1215,1216,1227,1237,1247],{},[31,1217,1218,1221,1224],{},[46,1219,1220],{},"443",[46,1222,1223],{},"TCP",[46,1225,1226],{},"HTTPS to CMS",[31,1228,1229,1232,1234],{},[46,1230,1231],{},"9505",[46,1233,1223],{},[46,1235,1236],{},"XMR push commands (CMS → player)",[31,1238,1239,1242,1244],{},[46,1240,1241],{},"8765\u002F8766",[46,1243,1223],{},[46,1245,1246],{},"Local proxy (LAN only, for video walls)",[31,1248,1249,1252,1255],{},[46,1250,1251],{},"5353",[46,1253,1254],{},"UDP",[46,1256,1257],{},"mDNS sync discovery (LAN only)",[16,1259,1260],{},"All player-to-CMS communication uses HTTPS. XMR is initiated by the player as an outbound WebSocket upgrade.",[73,1262,1264],{"id":1263},"cors-proxy","CORS proxy",[16,1266,1267,1268,1271],{},"Electron and Chromium include a built-in CORS proxy (",[20,1269,1270],{},"@xiboplayer\u002Fproxy",") that:",[932,1273,1274,1277,1280,1283],{},[935,1275,1276],{},"Forwards XMDS\u002FREST API calls to the CMS",[935,1278,1279],{},"Downloads media with Range support",[935,1281,1282],{},"Serves the PWA as static files",[935,1284,1285],{},"Hosts the WebSocket sync relay for video walls",[16,1287,1288],{},"No manual proxy configuration needed for single-display setups.",[73,1290,1292],{"id":1291},"reverse-proxy-optional","Reverse proxy (optional)",[16,1294,1295,1296,1301],{},"For HTTPS termination, use ",[924,1297,1300],{"href":1298,"rel":1299},"https:\u002F\u002Fgithub.com\u002Flinuxserver\u002Fdocker-swag",[928],"SWAG"," or nginx in front of the CMS:",[670,1303,1308],{"className":1304,"code":1306,"language":1307},[1305],"language-text","Internet → SWAG (HTTPS:443) → Xibo CMS (HTTP:80)\n","text",[20,1309,1306],{"__ignoreMap":675},[16,1311,1312],{},"SWAG provides automatic Let's Encrypt certificates and production-grade nginx.",[73,1314,1316],{"id":1315},"auto-start","Auto-start",[670,1318,1320],{"className":960,"code":1319,"language":962,"meta":675,"style":675},"# Enable player auto-start\nsystemctl --user enable xiboplayer-electron.service\n# or\nsystemctl --user enable xiboplayer-chromium.service\n",[20,1321,1322,1327,1341,1346],{"__ignoreMap":675},[679,1323,1324],{"class":681,"line":682},[679,1325,1326],{"class":969},"# Enable player auto-start\n",[679,1328,1329,1332,1335,1338],{"class":681,"line":689},[679,1330,1331],{"class":975},"systemctl",[679,1333,1334],{"class":982}," --user",[679,1336,1337],{"class":709}," enable",[679,1339,1340],{"class":709}," xiboplayer-electron.service\n",[679,1342,1343],{"class":681,"line":718},[679,1344,1345],{"class":969},"# or\n",[679,1347,1348,1350,1352,1354],{"class":681,"line":738},[679,1349,1331],{"class":975},[679,1351,1334],{"class":982},[679,1353,1337],{"class":709},[679,1355,1356],{"class":709}," xiboplayer-chromium.service\n",[16,1358,1359],{},"Kiosk images auto-start by default.",[73,1361,1363],{"id":1362},"file-locations","File locations",[25,1365,1366,1376],{},[28,1367,1368],{},[31,1369,1370,1373],{},[34,1371,1372],{},"Item",[34,1374,1375],{},"Path",[41,1377,1378,1387,1396,1406],{},[31,1379,1380,1383],{},[46,1381,1382],{},"Electron config",[46,1384,1385],{},[20,1386,53],{},[31,1388,1389,1392],{},[46,1390,1391],{},"Chromium config",[46,1393,1394],{},[20,1395,63],{},[31,1397,1398,1401],{},[46,1399,1400],{},"Content cache",[46,1402,1403],{},[20,1404,1405],{},"~\u002F.local\u002Fshare\u002Fxiboplayer\u002Fshared\u002Fcache\u002F",[31,1407,1408,1411],{},[46,1409,1410],{},"Player logs",[46,1412,1413],{},[20,1414,1415],{},"journalctl --user -u xiboplayer-electron -f",[877,1417,1418],{},"html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .stzsN, html code.shiki .stzsN{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sptTA, html code.shiki .sptTA{--shiki-light:#6182B8;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}",{"title":675,"searchDepth":718,"depth":718,"links":1420},[1421,1426,1431,1432,1433,1434,1435],{"id":913,"depth":689,"text":914,"children":1422},[1423,1424,1425],{"id":918,"depth":718,"text":919},{"id":998,"depth":718,"text":999},{"id":1015,"depth":718,"text":1016},{"id":1041,"depth":689,"text":1042,"children":1427},[1428,1429,1430],{"id":1045,"depth":718,"text":1046},{"id":1125,"depth":718,"text":1126},{"id":1185,"depth":718,"text":1186},{"id":1197,"depth":689,"text":1198},{"id":1263,"depth":689,"text":1264},{"id":1291,"depth":689,"text":1292},{"id":1315,"depth":689,"text":1316},{"id":1362,"depth":689,"text":1363},"Deploy xiboplayer with your own Xibo CMS",{"order":682},"\u002Fdocs\u002Fdeployment\u002Fself-hosted",{"title":902,"description":1436},"docs\u002Fdeployment\u002Fself-hosted","AHWaEz9zlskUNr5_gHWDyORb074-GjPLhE0cMkV0rqE",{"id":1443,"title":1444,"author":7,"body":1445,"date":7,"description":1840,"extension":893,"meta":1841,"navigation":895,"path":1842,"robots":7,"seo":1843,"stem":1844,"tags":7,"__hash__":1845},"content_en\u002Fdocs\u002Fgetting-started\u002Fconnect-display.md","Connect a Display",{"type":9,"value":1446,"toc":1828},[1447,1450,1453,1457,1460,1485,1489,1492,1570,1573,1599,1603,1609,1631,1638,1642,1645,1681,1685,1688,1703,1717,1721,1725,1759,1761,1764,1768,1817,1825],[12,1448,1444],{"id":1449},"connect-a-display",[16,1451,1452],{},"This guide walks you through connecting a new display to your Xibo CMS, from installation to seeing content on screen.",[73,1454,1456],{"id":1455},"_1-prerequisites","1. Prerequisites",[16,1458,1459],{},"Before you start, you'll need:",[932,1461,1462,1471,1479],{},[935,1463,1464,1467,1468,1470],{},[938,1465,1466],{},"Xibo CMS URL"," — the address of your CMS (e.g., ",[20,1469,710],{},")",[935,1472,1473,1475,1476],{},[938,1474,1037],{}," — found in your CMS under ",[938,1477,1478],{},"Settings → Display Settings → CMS Secret Key",[935,1480,1481,1484],{},[938,1482,1483],{},"A player device"," — a Linux PC, Raspberry Pi, or any machine with a browser",[73,1486,1488],{"id":1487},"_2-install-the-player","2. Install the player",[16,1490,1491],{},"Choose the player that fits your hardware:",[25,1493,1494,1507],{},[28,1495,1496],{},[31,1497,1498,1501,1504],{},[34,1499,1500],{},"Player",[34,1502,1503],{},"Best for",[34,1505,1506],{},"Install",[41,1508,1509,1524,1539,1554],{},[31,1510,1511,1516,1519],{},[46,1512,1513],{},[924,1514,48],{"href":1515},"\u002Fdocs\u002Fplayers\u002Felectron",[46,1517,1518],{},"Dedicated PCs with GPU",[46,1520,1521],{},[20,1522,1523],{},"dnf install xiboplayer-electron",[31,1525,1526,1531,1534],{},[46,1527,1528],{},[924,1529,58],{"href":1530},"\u002Fdocs\u002Fplayers\u002Fchromium",[46,1532,1533],{},"Lightweight PCs, ARM boards",[46,1535,1536],{},[20,1537,1538],{},"dnf install xiboplayer-chromium",[31,1540,1541,1546,1549],{},[46,1542,1543],{},[924,1544,1186],{"href":1545},"\u002Fdocs\u002Fplayers\u002Fkiosk",[46,1547,1548],{},"Flash-and-boot appliances",[46,1550,1551,1552],{},"Download ISO from ",[924,1553,1193],{"href":1192},[31,1555,1556,1561,1564],{},[46,1557,1558],{},[924,1559,68],{"href":1560},"\u002Fdocs\u002Fplayers\u002Fpwa",[46,1562,1563],{},"Any browser, quick testing",[46,1565,1566,1567],{},"Open ",[20,1568,1569],{},"https:\u002F\u002Fyour-cms\u002Fplayer\u002F",[16,1571,1572],{},"For RPM-based systems, first add the xiboplayer repository:",[670,1574,1576],{"className":960,"code":1575,"language":962,"meta":675,"style":675},"sudo dnf install https:\u002F\u002Fdl.xiboplayer.org\u002Frpm\u002Ffedora\u002F43\u002Fnoarch\u002Fxiboplayer-release-43-7.fc43.noarch.rpm\nsudo dnf install xiboplayer-electron\n",[20,1577,1578,1588],{"__ignoreMap":675},[679,1579,1580,1582,1584,1586],{"class":681,"line":682},[679,1581,1061],{"class":975},[679,1583,1064],{"class":709},[679,1585,1067],{"class":709},[679,1587,1070],{"class":709},[679,1589,1590,1592,1594,1596],{"class":681,"line":689},[679,1591,1061],{"class":975},[679,1593,1064],{"class":709},[679,1595,1067],{"class":709},[679,1597,1598],{"class":709}," xiboplayer-electron\n",[73,1600,1602],{"id":1601},"_3-first-launch","3. First launch",[16,1604,1605,1606,702],{},"When the player starts for the first time, you'll see the ",[938,1607,1608],{},"setup page",[932,1610,1611,1619,1625],{},[935,1612,1613,1615,1616],{},[938,1614,1033],{}," — enter your full CMS address including ",[20,1617,1618],{},"https:\u002F\u002F",[935,1620,1621,1624],{},[938,1622,1623],{},"CMS Key"," — the secret key from step 1",[935,1626,1627,1630],{},[938,1628,1629],{},"Display Name"," — a friendly name (e.g., \"Lobby Screen\", \"Meeting Room 3\")",[16,1632,1633,1634,1637],{},"Click ",[938,1635,1636],{},"Connect",". The player will register with the CMS.",[73,1639,1641],{"id":1640},"_4-authorize-in-cms","4. Authorize in CMS",[16,1643,1644],{},"The player is now waiting for authorization:",[1646,1647,1648,1655,1662,1668,1674],"ol",{},[935,1649,1650,1651,1654],{},"Log into your ",[938,1652,1653],{},"Xibo CMS"," web interface",[935,1656,1657,1658,1661],{},"Navigate to ",[938,1659,1660],{},"Displays"," in the left menu",[935,1663,1664,1665],{},"You'll see your new display with a status of ",[938,1666,1667],{},"Waiting for approval",[935,1669,1670,1671],{},"Click the row menu (three dots) → ",[938,1672,1673],{},"Authorise",[935,1675,1676,1677,1680],{},"Optionally, assign the display to a ",[938,1678,1679],{},"Display Group"," for easier scheduling",[73,1682,1684],{"id":1683},"_5-verify-content","5. Verify content",[16,1686,1687],{},"After authorization:",[932,1689,1690,1697,1700],{},[935,1691,1692,1693,1696],{},"The player receives the ",[938,1694,1695],{},"default layout"," from the CMS",[935,1698,1699],{},"Content should appear within 30-60 seconds (the next collection cycle)",[935,1701,1702],{},"If you've scheduled specific campaigns, they'll appear according to the schedule",[16,1704,1705,1706,1708,1709,1712,1713,1716],{},"To force an immediate update, go to ",[938,1707,1660],{}," in the CMS, click the row menu → ",[938,1710,1711],{},"Send Command"," → ",[938,1714,1715],{},"Collect Now",".",[73,1718,1720],{"id":1719},"_6-auto-start-on-boot","6. Auto-start on boot",[916,1722,1724],{"id":1723},"electron-chromium-systemd","Electron \u002F Chromium (systemd)",[670,1726,1728],{"className":960,"code":1727,"language":962,"meta":675,"style":675},"# Enable auto-start for the current user\nsystemctl --user enable xiboplayer-electron.service\n# or\nsystemctl --user enable xiboplayer-chromium.service\n",[20,1729,1730,1735,1745,1749],{"__ignoreMap":675},[679,1731,1732],{"class":681,"line":682},[679,1733,1734],{"class":969},"# Enable auto-start for the current user\n",[679,1736,1737,1739,1741,1743],{"class":681,"line":689},[679,1738,1331],{"class":975},[679,1740,1334],{"class":982},[679,1742,1337],{"class":709},[679,1744,1340],{"class":709},[679,1746,1747],{"class":681,"line":718},[679,1748,1345],{"class":969},[679,1750,1751,1753,1755,1757],{"class":681,"line":738},[679,1752,1331],{"class":975},[679,1754,1334],{"class":982},[679,1756,1337],{"class":709},[679,1758,1356],{"class":709},[916,1760,1186],{"id":1185},[16,1762,1763],{},"Auto-start is already configured. The display boots directly into the player.",[73,1765,1767],{"id":1766},"troubleshooting","Troubleshooting",[25,1769,1770,1780],{},[28,1771,1772],{},[31,1773,1774,1777],{},[34,1775,1776],{},"Problem",[34,1778,1779],{},"Solution",[41,1781,1782,1793,1801,1809],{},[31,1783,1784,1787],{},[46,1785,1786],{},"\"Connection refused\"",[46,1788,1789,1790,1792],{},"Check the CMS URL includes ",[20,1791,1618],{}," and the port if non-standard",[31,1794,1795,1798],{},[46,1796,1797],{},"\"Invalid server key\"",[46,1799,1800],{},"Verify the CMS Key matches Settings → Display Settings → CMS Secret Key",[31,1802,1803,1806],{},[46,1804,1805],{},"Display stays pending",[46,1807,1808],{},"Check the CMS firewall allows connections from the player's IP",[31,1810,1811,1814],{},[46,1812,1813],{},"Content doesn't update",[46,1815,1816],{},"Wait for the collection interval (default: 5 minutes) or send Collect Now",[16,1818,1819,1820,1824],{},"See the full ",[924,1821,1823],{"href":1822},"\u002Fdocs\u002Ftroubleshooting","Troubleshooting guide"," for more solutions.",[877,1826,1827],{},"html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .stzsN, html code.shiki .stzsN{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":675,"searchDepth":718,"depth":718,"links":1829},[1830,1831,1832,1833,1834,1835,1839],{"id":1455,"depth":689,"text":1456},{"id":1487,"depth":689,"text":1488},{"id":1601,"depth":689,"text":1602},{"id":1640,"depth":689,"text":1641},{"id":1683,"depth":689,"text":1684},{"id":1719,"depth":689,"text":1720,"children":1836},[1837,1838],{"id":1723,"depth":718,"text":1724},{"id":1185,"depth":718,"text":1186},{"id":1766,"depth":689,"text":1767},"Step-by-step guide to connecting your first display to Xibo CMS",{"order":689},"\u002Fdocs\u002Fgetting-started\u002Fconnect-display",{"title":1444,"description":1840},"docs\u002Fgetting-started\u002Fconnect-display","DWydfzCvCeyTx9QBATN9Kej9BDeQgNFzc1KVgpOVUaM",{"id":1847,"title":1848,"author":7,"body":1849,"date":7,"description":2205,"extension":893,"meta":2206,"navigation":895,"path":2207,"robots":7,"seo":2208,"stem":2209,"tags":7,"__hash__":2210},"content_en\u002Fdocs\u002Fgetting-started\u002Ffirst-boot.md","First Boot",{"type":9,"value":1850,"toc":2193},[1851,1854,1857,1861,1893,1897,1904,1936,1939,1943,1954,1958,1961,2013,2022,2026,2029,2041,2048,2052,2063,2097,2099,2102,2133,2137,2140,2162,2168,2172,2175],[12,1852,1848],{"id":1853},"first-boot",[16,1855,1856],{},"When you boot a xiboplayer kiosk image for the first time, the system goes through an automated setup process.",[73,1858,1860],{"id":1859},"boot-sequence","Boot sequence",[1646,1862,1863,1873,1879,1890],{},[935,1864,1865,1868,1869,1872],{},[938,1866,1867],{},"GDM"," starts and auto-logs in as the ",[20,1870,1871],{},"xibo"," user",[935,1874,1875,1878],{},[938,1876,1877],{},"GNOME Kiosk"," loads the kiosk script session",[935,1880,1881,1882,1885,1886,1889],{},"The ",[938,1883,1884],{},"init script"," checks if ",[20,1887,1888],{},"~\u002F.local\u002Fshare\u002Fxibo\u002Fsetup-result.json"," exists",[935,1891,1892],{},"First boot: runs two-phase setup wizard. Normal boot: starts player directly.",[73,1894,1896],{"id":1895},"phase-1-gnome-initial-setup","Phase 1: gnome-initial-setup",[16,1898,1899,1900,1903],{},"The standard GNOME initial setup wizard runs first. A ",[20,1901,1902],{},"vendor.conf"," configuration skips account\u002Fprivacy\u002Fwelcome pages, keeping only:",[932,1905,1906,1912,1918,1924,1930],{},[935,1907,1908,1911],{},[938,1909,1910],{},"Language"," selection",[935,1913,1914,1917],{},[938,1915,1916],{},"Keyboard"," layout",[935,1919,1920,1923],{},[938,1921,1922],{},"Network"," connection",[935,1925,1926,1929],{},[938,1927,1928],{},"Timezone"," detection",[935,1931,1932,1935],{},[938,1933,1934],{},"Password"," change",[16,1937,1938],{},"This is the standard GNOME experience — same as a fresh Fedora Workstation install but trimmed for kiosk use.",[73,1940,1942],{"id":1941},"phase-2-xiboplayer-setup","Phase 2: xiboplayer-setup",[16,1944,1945,1946,1949,1950,1953],{},"After system setup completes, a native ",[938,1947,1948],{},"libadwaita"," GTK4 wizard launches (",[20,1951,1952],{},"xiboplayer-setup.py","), matching the gnome-initial-setup visual style:",[916,1955,1957],{"id":1956},"player-selection","Player selection",[16,1959,1960],{},"Choose which player to use as the default:",[25,1962,1963,1974],{},[28,1964,1965],{},[31,1966,1967,1969,1972],{},[34,1968,1500],{},[34,1970,1971],{},"Priority",[34,1973,91],{},[41,1975,1976,1988,2000],{},[31,1977,1978,1982,1985],{},[46,1979,1980],{},[938,1981,48],{},[46,1983,1984],{},"Highest",[46,1986,1987],{},"Best performance, bundles its own Chromium",[31,1989,1990,1994,1997],{},[46,1991,1992],{},[938,1993,58],{},[46,1995,1996],{},"Medium",[46,1998,1999],{},"Uses system Chromium, lighter footprint",[31,2001,2002,2007,2010],{},[46,2003,2004],{},[938,2005,2006],{},"arexibo",[46,2008,2009],{},"Lowest",[46,2011,2012],{},"Native Rust player, standalone rendering",[16,2014,2015,2016,2019,2020,1716],{},"The selected player is set via the ",[20,2017,2018],{},"alternatives"," system and recorded in ",[20,2021,1888],{},[916,2023,2025],{"id":2024},"cms-configuration-arexibo-only","CMS configuration (arexibo only)",[16,2027,2028],{},"If you selected arexibo, the wizard prompts for:",[932,2030,2031,2036],{},[935,2032,2033,2035],{},[938,2034,1033],{}," — your Xibo CMS server address",[935,2037,2038,2040],{},[938,2039,1623],{}," — the server key from CMS Settings",[16,2042,2043,2044,2047],{},"For ",[938,2045,2046],{},"Electron and Chromium",", CMS configuration happens in the player's own web-based setup page, which opens automatically after the player starts. No CMS details are needed in the kiosk wizard.",[73,2049,2051],{"id":2050},"phase-3-player-starts","Phase 3: Player starts",[16,2053,2054,2055,2058,2059,2062],{},"The wizard writes ",[20,2056,2057],{},"setup-result.json"," and hands off to the main kiosk session (",[20,2060,2061],{},"gnome-kiosk-script.xibo.sh","), which:",[1646,2064,2065,2076,2079,2082,2087,2094],{},[935,2066,2067,2068,2071,2072,2075],{},"Starts ",[20,2069,2070],{},"dunst"," (notifications) and ",[20,2073,2074],{},"unclutter"," (cursor hiding)",[935,2077,2078],{},"Imports Wayland display environment into systemd user manager",[935,2080,2081],{},"Disables screen blanking and the GNOME 48 donation popup",[935,2083,2084,2085,1470],{},"Starts the selected player service (from ",[20,2086,2057],{},[935,2088,2089,2090,2093],{},"Begins a ",[938,2091,2092],{},"health monitoring loop"," (checks every 10 seconds)",[935,2095,2096],{},"After 3 consecutive failures, offers a reconfiguration dialog",[73,2098,558],{"id":557},[16,2100,2101],{},"During normal operation on a kiosk:",[25,2103,2104,2113],{},[28,2105,2106],{},[31,2107,2108,2111],{},[34,2109,2110],{},"Shortcut",[34,2112,572],{},[41,2114,2115,2124],{},[31,2116,2117,2121],{},[46,2118,2119],{},[20,2120,611],{},[46,2122,2123],{},"Show IP address, CMS URL, and player status",[31,2125,2126,2130],{},[46,2127,2128],{},[20,2129,621],{},[46,2131,2132],{},"Reconfigure CMS connection (stops player, launches wizard)",[73,2134,2136],{"id":2135},"default-credentials","Default credentials",[16,2138,2139],{},"The kiosk image ships with:",[932,2141,2142,2150,2156],{},[935,2143,2144,2147,2148],{},[938,2145,2146],{},"User",": ",[20,2149,1871],{},[935,2151,2152,2147,2154],{},[938,2153,1934],{},[20,2155,1871],{},[935,2157,2158,2161],{},[938,2159,2160],{},"Root",": locked (no root login)",[16,2163,2164,2165],{},"Change the password after first boot: ",[20,2166,2167],{},"passwd xibo",[73,2169,2171],{"id":2170},"atomic-image-differences","Atomic image differences",[16,2173,2174],{},"On Atomic kiosk images (built on fedora-bootc):",[932,2176,2177,2180,2187],{},[935,2178,2179],{},"The OS is immutable — cannot be accidentally modified",[935,2181,2182,2183,2186],{},"Updates via ",[20,2184,2185],{},"bootc switch"," with automatic rollback on failure",[935,2188,2189,2190],{},"Additional packages can be layered via ",[20,2191,2192],{},"bootc install",{"title":675,"searchDepth":718,"depth":718,"links":2194},[2195,2196,2197,2201,2202,2203,2204],{"id":1859,"depth":689,"text":1860},{"id":1895,"depth":689,"text":1896},{"id":1941,"depth":689,"text":1942,"children":2198},[2199,2200],{"id":1956,"depth":718,"text":1957},{"id":2024,"depth":718,"text":2025},{"id":2050,"depth":689,"text":2051},{"id":557,"depth":689,"text":558},{"id":2135,"depth":689,"text":2136},{"id":2170,"depth":689,"text":2171},"What happens when a xiboplayer kiosk boots for the first time",{"order":718},"\u002Fdocs\u002Fgetting-started\u002Ffirst-boot",{"title":1848,"description":2205},"docs\u002Fgetting-started\u002Ffirst-boot","6IqunCVsR9uWuU57JPYhr9-IuvfLOsBda7cA66OBj18",{"id":2212,"title":2213,"author":7,"body":2214,"date":7,"description":2417,"extension":893,"meta":2418,"navigation":895,"path":2419,"robots":7,"seo":2420,"stem":2421,"tags":7,"__hash__":2422},"content_en\u002Fdocs\u002Fgetting-started\u002Fquick-start.md","Quick Start",{"type":9,"value":2215,"toc":2406},[2216,2219,2222,2226,2242,2245,2249,2307,2311,2317,2321,2329,2333,2359,2363,2382,2386,2403],[12,2217,2213],{"id":2218},"quick-start",[16,2220,2221],{},"Get your first xiboplayer display up and running.",[73,2223,2225],{"id":2224},"prerequisites","Prerequisites",[932,2227,2228,2239],{},[935,2229,2230,2231,2233,2234,1470],{},"A ",[938,2232,1653],{}," instance (self-hosted or cloud at ",[924,2235,2238],{"href":2236,"rel":2237},"https:\u002F\u002Fxibosignage.com",[928],"xibosignage.com",[935,2240,2241],{},"A Linux machine, Raspberry Pi, or any device with a web browser",[73,2243,1506],{"id":2244},"install",[916,2246,2248],{"id":2247},"option-a-package-manager-fedoraubuntu","Option A: Package manager (Fedora\u002FUbuntu)",[670,2250,2252],{"className":960,"code":2251,"language":962,"meta":675,"style":675},"# Add the xiboplayer repository\nsudo dnf install https:\u002F\u002Fdl.xiboplayer.org\u002Frpm\u002Ffedora\u002F43\u002Fnoarch\u002Fxiboplayer-release-43-7.fc43.noarch.rpm\n\n# Install the Chromium player (recommended)\nsudo dnf install xiboplayer-chromium\n\n# Or the Chromium player (lightweight)\nsudo dnf install xiboplayer-chromium\n",[20,2253,2254,2258,2268,2272,2277,2288,2292,2297],{"__ignoreMap":675},[679,2255,2256],{"class":681,"line":682},[679,2257,1056],{"class":969},[679,2259,2260,2262,2264,2266],{"class":681,"line":689},[679,2261,1061],{"class":975},[679,2263,1064],{"class":709},[679,2265,1067],{"class":709},[679,2267,1070],{"class":709},[679,2269,2270],{"class":681,"line":718},[679,2271,1075],{"emptyLinePlaceholder":895},[679,2273,2274],{"class":681,"line":738},[679,2275,2276],{"class":969},"# Install the Chromium player (recommended)\n",[679,2278,2279,2281,2283,2285],{"class":681,"line":758},[679,2280,1061],{"class":975},[679,2282,1064],{"class":709},[679,2284,1067],{"class":709},[679,2286,2287],{"class":709}," xiboplayer-chromium\n",[679,2289,2290],{"class":681,"line":775},[679,2291,1075],{"emptyLinePlaceholder":895},[679,2293,2294],{"class":681,"line":794},[679,2295,2296],{"class":969},"# Or the Chromium player (lightweight)\n",[679,2298,2299,2301,2303,2305],{"class":681,"line":813},[679,2300,1061],{"class":975},[679,2302,1064],{"class":709},[679,2304,1067],{"class":709},[679,2306,2287],{"class":709},[916,2308,2310],{"id":2309},"option-b-kiosk-image-dedicated-display","Option B: Kiosk image (dedicated display)",[16,2312,2313,2314,2316],{},"Download a pre-built image from the ",[924,2315,1193],{"href":1192}," page. Flash it to a USB drive or SD card, boot, and the player starts automatically.",[916,2318,2320],{"id":2319},"option-c-pwa-any-browser","Option C: PWA (any browser)",[16,2322,2323,2324,2328],{},"Deploy the PWA to your web server and open it in any modern browser. See the ",[924,2325,2327],{"href":2326},"\u002Fplayers\u002Fpwa","PWA player page"," for details.",[73,2330,2332],{"id":2331},"configure","Configure",[1646,2334,2335,2340,2349,2355],{},[935,2336,2337,2338],{},"Launch the player — it opens the ",[938,2339,1608],{},[935,2341,2342,2343,2345,2346,1470],{},"Enter your ",[938,2344,1033],{}," (e.g., ",[20,2347,2348],{},"https:\u002F\u002Fyour-cms.example.com",[935,2350,2351,2352,2354],{},"Enter the ",[938,2353,1623],{}," (found in CMS → Settings → Display Settings → CMS Secret Key)",[935,2356,1633,2357],{},[938,2358,1636],{},[73,2360,2362],{"id":2361},"authorize-in-cms","Authorize in CMS",[1646,2364,2365,2368,2374,2379],{},[935,2366,2367],{},"Log into your Xibo CMS",[935,2369,2370,2371,2373],{},"Go to ",[938,2372,1660],{}," — you'll see a new pending display",[935,2375,2376,2377],{},"Click the row menu → ",[938,2378,1673],{},[935,2380,2381],{},"The player starts showing the default layout",[73,2383,2385],{"id":2384},"next-steps","Next steps",[932,2387,2388,2393,2398],{},[935,2389,2390,2392],{},[924,2391,1444],{"href":1842}," — detailed walkthrough",[935,2394,2395,2397],{},[924,2396,6],{"href":896}," — all config options",[935,2399,2400,2402],{},[924,2401,1767],{"href":1822}," — common issues",[877,2404,2405],{},"html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":675,"searchDepth":718,"depth":718,"links":2407},[2408,2409,2414,2415,2416],{"id":2224,"depth":689,"text":2225},{"id":2244,"depth":689,"text":1506,"children":2410},[2411,2412,2413],{"id":2247,"depth":718,"text":2248},{"id":2309,"depth":718,"text":2310},{"id":2319,"depth":718,"text":2320},{"id":2331,"depth":689,"text":2332},{"id":2361,"depth":689,"text":2362},{"id":2384,"depth":689,"text":2385},"Get a Xibo digital signage player running in 5 minutes",{"order":682},"\u002Fdocs\u002Fgetting-started\u002Fquick-start",{"title":2213,"description":2417},"docs\u002Fgetting-started\u002Fquick-start","XN_pBKhQWOoUypRnRbBmin0doySszj51GeC5OcPLTZc",{"id":2424,"title":2006,"author":7,"body":2425,"date":7,"description":2754,"extension":893,"meta":2755,"navigation":895,"path":2756,"robots":7,"seo":2757,"stem":2758,"tags":7,"__hash__":2759},"content_en\u002Fdocs\u002Fplayers\u002Farexibo.md",{"type":9,"value":2426,"toc":2743},[2427,2429,2432,2436,2477,2479,2483,2509,2513,2589,2593,2627,2631,2637,2641,2719,2723,2740],[12,2428,2006],{"id":2006},[16,2430,2431],{},"Native Xibo player built in Rust with Qt6 WebEngine rendering. Standalone — does not use the PWA engine or the JavaScript SDK.",[73,2433,2435],{"id":2434},"features","Features",[932,2437,2438,2444,2450,2456,2462,2468],{},[935,2439,2440,2443],{},[938,2441,2442],{},"Native Rust"," — low resource usage, fast startup",[935,2445,2446,2449],{},[938,2447,2448],{},"Qt6 WebEngine"," — hardware-accelerated rendering",[935,2451,2452,2455],{},[938,2453,2454],{},"XMDS SOAP v5"," — generated from WSDL at compile time",[935,2457,2458,2461],{},[938,2459,2460],{},"XMR WebSocket"," — real-time commands with ARC4 decryption",[935,2463,2464,2467],{},[938,2465,2466],{},"Serial port control"," — hardware integration for displays",[935,2469,2470,2473,2474],{},[938,2471,2472],{},"Offline mode"," — cached schedule playback with ",[20,2475,2476],{},"--allow-offline",[73,2478,1506],{"id":2244},[916,2480,2482],{"id":2481},"fedora-rhel","Fedora \u002F RHEL",[670,2484,2486],{"className":960,"code":2485,"language":962,"meta":675,"style":675},"sudo dnf install https:\u002F\u002Fdl.xiboplayer.org\u002Frpm\u002Ffedora\u002F43\u002Fnoarch\u002Fxiboplayer-release-43-7.fc43.noarch.rpm\nsudo dnf install arexibo\n",[20,2487,2488,2498],{"__ignoreMap":675},[679,2489,2490,2492,2494,2496],{"class":681,"line":682},[679,2491,1061],{"class":975},[679,2493,1064],{"class":709},[679,2495,1067],{"class":709},[679,2497,1070],{"class":709},[679,2499,2500,2502,2504,2506],{"class":681,"line":689},[679,2501,1061],{"class":975},[679,2503,1064],{"class":709},[679,2505,1067],{"class":709},[679,2507,2508],{"class":709}," arexibo\n",[916,2510,2512],{"id":2511},"ubuntu-debian","Ubuntu \u002F Debian",[670,2514,2516],{"className":960,"code":2515,"language":962,"meta":675,"style":675},"curl -fsSL https:\u002F\u002Fdl.xiboplayer.org\u002Fdeb\u002FGPG-KEY.asc | sudo tee \u002Fusr\u002Fshare\u002Fkeyrings\u002Fxiboplayer.asc > \u002Fdev\u002Fnull\necho \"deb [signed-by=\u002Fusr\u002Fshare\u002Fkeyrings\u002Fxiboplayer.asc] https:\u002F\u002Fdl.xiboplayer.org\u002Fdeb\u002Fdebian\u002Ftrixie .\u002F\" | sudo tee \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fxiboplayer.list\nsudo apt update && sudo apt install arexibo\n",[20,2517,2518,2548,2569],{"__ignoreMap":675},[679,2519,2520,2523,2526,2529,2533,2536,2539,2542,2545],{"class":681,"line":682},[679,2521,2522],{"class":975},"curl",[679,2524,2525],{"class":982}," -fsSL",[679,2527,2528],{"class":709}," https:\u002F\u002Fdl.xiboplayer.org\u002Fdeb\u002FGPG-KEY.asc",[679,2530,2532],{"class":2531},"smGrS"," |",[679,2534,2535],{"class":975}," sudo",[679,2537,2538],{"class":709}," tee",[679,2540,2541],{"class":709}," \u002Fusr\u002Fshare\u002Fkeyrings\u002Fxiboplayer.asc",[679,2543,2544],{"class":2531}," >",[679,2546,2547],{"class":709}," \u002Fdev\u002Fnull\n",[679,2549,2550,2553,2555,2558,2560,2562,2564,2566],{"class":681,"line":689},[679,2551,2552],{"class":1150},"echo",[679,2554,706],{"class":705},[679,2556,2557],{"class":709},"deb [signed-by=\u002Fusr\u002Fshare\u002Fkeyrings\u002Fxiboplayer.asc] https:\u002F\u002Fdl.xiboplayer.org\u002Fdeb\u002Fdebian\u002Ftrixie .\u002F",[679,2559,699],{"class":705},[679,2561,2532],{"class":2531},[679,2563,2535],{"class":975},[679,2565,2538],{"class":709},[679,2567,2568],{"class":709}," \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fxiboplayer.list\n",[679,2570,2571,2573,2576,2579,2581,2583,2585,2587],{"class":681,"line":718},[679,2572,1061],{"class":975},[679,2574,2575],{"class":709}," apt",[679,2577,2578],{"class":709}," update",[679,2580,1157],{"class":685},[679,2582,2535],{"class":975},[679,2584,2575],{"class":709},[679,2586,1067],{"class":709},[679,2588,2508],{"class":709},[73,2590,2592],{"id":2591},"usage","Usage",[670,2594,2596],{"className":960,"code":2595,"language":962,"meta":675,"style":675},"arexibo --cms https:\u002F\u002Fcms.example.com --key YOUR_KEY\narexibo --allow-offline ~\u002F.local\u002Fshare\u002Fxibo    # offline mode\n",[20,2597,2598,2614],{"__ignoreMap":675},[679,2599,2600,2602,2605,2608,2611],{"class":681,"line":682},[679,2601,2006],{"class":975},[679,2603,2604],{"class":982}," --cms",[679,2606,2607],{"class":709}," https:\u002F\u002Fcms.example.com",[679,2609,2610],{"class":982}," --key",[679,2612,2613],{"class":709}," YOUR_KEY\n",[679,2615,2616,2618,2621,2624],{"class":681,"line":689},[679,2617,2006],{"class":975},[679,2619,2620],{"class":982}," --allow-offline",[679,2622,2623],{"class":709}," ~\u002F.local\u002Fshare\u002Fxibo",[679,2625,2626],{"class":969},"    # offline mode\n",[73,2628,2630],{"id":2629},"architecture","Architecture",[670,2632,2635],{"className":2633,"code":2634,"language":1307},[1305],"Rust backend (Handler thread)\n  ├── XMDS SOAP client (auto-generated from xmds_v5.wsdl)\n  ├── XMR WebSocket (RSA + ARC4 decryption)\n  ├── Schedule parser\n  └── File cache manager\n         ↕ crossbeam-channel\nQt GUI thread\n  └── Qt6 WebEngine (layout rendering)\n",[20,2636,2634],{"__ignoreMap":675},[73,2638,2640],{"id":2639},"comparison-with-sdk-based-players","Comparison with SDK-based players",[25,2642,2643,2654],{},[28,2644,2645],{},[31,2646,2647,2649,2651],{},[34,2648],{},[34,2650,2006],{},[34,2652,2653],{},"Electron\u002FChromium",[41,2655,2656,2666,2676,2686,2697,2708],{},[31,2657,2658,2660,2663],{},[46,2659,1910],{},[46,2661,2662],{},"Rust + C++ (Qt)",[46,2664,2665],{},"JavaScript",[31,2667,2668,2671,2673],{},[46,2669,2670],{},"Rendering",[46,2672,2448],{},[46,2674,2675],{},"Chromium (bundled or system)",[31,2677,2678,2680,2683],{},[46,2679,1210],{},[46,2681,2682],{},"XMDS SOAP v5 only",[46,2684,2685],{},"SOAP + REST (auto-detect)",[31,2687,2688,2691,2694],{},[46,2689,2690],{},"Video walls",[46,2692,2693],{},"Not supported",[46,2695,2696],{},"\u003C8ms sync, 12 effects",[31,2698,2699,2702,2705],{},[46,2700,2701],{},"Binary size",[46,2703,2704],{},"~15 MB",[46,2706,2707],{},"~150 MB (Electron) \u002F ~5 MB (Chromium)",[31,2709,2710,2713,2716],{},[46,2711,2712],{},"Alternatives priority",[46,2714,2715],{},"10 (lowest)",[46,2717,2718],{},"30 \u002F 20",[73,2720,2722],{"id":2721},"source","Source",[932,2724,2725,2732],{},[935,2726,2727],{},[924,2728,2731],{"href":2729,"rel":2730},"https:\u002F\u002Fgithub.com\u002Fxibo-players\u002Farexibo",[928],"GitHub: xibo-players\u002Farexibo",[935,2733,2734,2735],{},"Original upstream: ",[924,2736,2739],{"href":2737,"rel":2738},"https:\u002F\u002Fgithub.com\u002Fbirkenfeld\u002Farexibo",[928],"birkenfeld\u002Farexibo",[877,2741,2742],{},"html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .stzsN, html code.shiki .stzsN{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sptTA, html code.shiki .sptTA{--shiki-light:#6182B8;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}",{"title":675,"searchDepth":718,"depth":718,"links":2744},[2745,2746,2750,2751,2752,2753],{"id":2434,"depth":689,"text":2435},{"id":2244,"depth":689,"text":1506,"children":2747},[2748,2749],{"id":2481,"depth":718,"text":2482},{"id":2511,"depth":718,"text":2512},{"id":2591,"depth":689,"text":2592},{"id":2629,"depth":689,"text":2630},{"id":2639,"depth":689,"text":2640},{"id":2721,"depth":689,"text":2722},"High-performance native signage player built in Rust with Qt rendering",{"order":738},"\u002Fdocs\u002Fplayers\u002Farexibo",{"title":2006,"description":2754},"docs\u002Fplayers\u002Farexibo","f27vR7fauajCYlMnBFWi3hShC4ClQEsv7Sn5Ma1uhO8",{"id":2761,"title":2762,"author":7,"body":2763,"date":7,"description":3099,"extension":893,"meta":3100,"navigation":895,"path":1530,"robots":7,"seo":3101,"stem":3102,"tags":7,"__hash__":3103},"content_en\u002Fdocs\u002Fplayers\u002Fchromium.md","Chromium Player",{"type":9,"value":2764,"toc":3087},[2765,2768,2775,2777,2815,2817,2819,2844,2846,2908,2910,2953,2955,2973,2977,2982,2988,2992,2996,3074,3076,3085],[12,2766,2762],{"id":2767},"chromium-player",[16,2769,2770,2771,2774],{},"Lightweight player that uses the system Chromium browser in kiosk mode. Architecture-independent (",[20,2772,2773],{},"noarch",") — works on any Linux system with Chromium installed.",[73,2776,2435],{"id":2434},[932,2778,2779,2785,2791,2797,2807],{},[935,2780,2781,2784],{},[938,2782,2783],{},"Uses system browser"," — no bundled Chromium, minimal disk footprint",[935,2786,2787,2790],{},[938,2788,2789],{},"GPU rasterization"," — offloads rendering to GPU (4-5% CPU in production)",[935,2792,2793,2796],{},[938,2794,2795],{},"Video wall sync"," — same sync protocol as Electron",[935,2798,2799,2802,2803,2806],{},[938,2800,2801],{},"Bash launcher"," — ",[20,2804,2805],{},"launch-kiosk.sh"," manages server, Chromium, and cleanup",[935,2808,2809,2802,2812,2814],{},[938,2810,2811],{},"Architecture-independent",[20,2813,2773],{}," package works on x86_64 and aarch64",[73,2816,1506],{"id":2244},[916,2818,2482],{"id":2481},[670,2820,2822],{"className":960,"code":2821,"language":962,"meta":675,"style":675},"sudo dnf install https:\u002F\u002Fdl.xiboplayer.org\u002Frpm\u002Ffedora\u002F43\u002Fnoarch\u002Fxiboplayer-release-43-7.fc43.noarch.rpm\nsudo dnf install xiboplayer-chromium\n",[20,2823,2824,2834],{"__ignoreMap":675},[679,2825,2826,2828,2830,2832],{"class":681,"line":682},[679,2827,1061],{"class":975},[679,2829,1064],{"class":709},[679,2831,1067],{"class":709},[679,2833,1070],{"class":709},[679,2835,2836,2838,2840,2842],{"class":681,"line":689},[679,2837,1061],{"class":975},[679,2839,1064],{"class":709},[679,2841,1067],{"class":709},[679,2843,2287],{"class":709},[916,2845,2512],{"id":2511},[670,2847,2849],{"className":960,"code":2848,"language":962,"meta":675,"style":675},"curl -fsSL https:\u002F\u002Fdl.xiboplayer.org\u002Fdeb\u002FGPG-KEY.asc | sudo tee \u002Fusr\u002Fshare\u002Fkeyrings\u002Fxiboplayer.asc > \u002Fdev\u002Fnull\necho \"deb [signed-by=\u002Fusr\u002Fshare\u002Fkeyrings\u002Fxiboplayer.asc] https:\u002F\u002Fdl.xiboplayer.org\u002Fdeb\u002Fubuntu\u002F24.04 .\u002F\" | sudo tee \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fxiboplayer.list\nsudo apt update && sudo apt install xiboplayer-chromium\n",[20,2850,2851,2871,2890],{"__ignoreMap":675},[679,2852,2853,2855,2857,2859,2861,2863,2865,2867,2869],{"class":681,"line":682},[679,2854,2522],{"class":975},[679,2856,2525],{"class":982},[679,2858,2528],{"class":709},[679,2860,2532],{"class":2531},[679,2862,2535],{"class":975},[679,2864,2538],{"class":709},[679,2866,2541],{"class":709},[679,2868,2544],{"class":2531},[679,2870,2547],{"class":709},[679,2872,2873,2875,2877,2880,2882,2884,2886,2888],{"class":681,"line":689},[679,2874,2552],{"class":1150},[679,2876,706],{"class":705},[679,2878,2879],{"class":709},"deb [signed-by=\u002Fusr\u002Fshare\u002Fkeyrings\u002Fxiboplayer.asc] https:\u002F\u002Fdl.xiboplayer.org\u002Fdeb\u002Fubuntu\u002F24.04 .\u002F",[679,2881,699],{"class":705},[679,2883,2532],{"class":2531},[679,2885,2535],{"class":975},[679,2887,2538],{"class":709},[679,2889,2568],{"class":709},[679,2891,2892,2894,2896,2898,2900,2902,2904,2906],{"class":681,"line":718},[679,2893,1061],{"class":975},[679,2895,2575],{"class":709},[679,2897,2578],{"class":709},[679,2899,1157],{"class":685},[679,2901,2535],{"class":975},[679,2903,2575],{"class":709},[679,2905,1067],{"class":709},[679,2907,2287],{"class":709},[73,2909,2592],{"id":2591},[670,2911,2913],{"className":960,"code":2912,"language":962,"meta":675,"style":675},"xiboplayer-chromium                    # kiosk mode\nxiboplayer-chromium --no-kiosk         # windowed\nxiboplayer-chromium --instance=lobby   # named instance\nxiboplayer-chromium --port=9000        # custom port\n",[20,2914,2915,2923,2933,2943],{"__ignoreMap":675},[679,2916,2917,2920],{"class":681,"line":682},[679,2918,2919],{"class":975},"xiboplayer-chromium",[679,2921,2922],{"class":969},"                    # kiosk mode\n",[679,2924,2925,2927,2930],{"class":681,"line":689},[679,2926,2919],{"class":975},[679,2928,2929],{"class":982}," --no-kiosk",[679,2931,2932],{"class":969},"         # windowed\n",[679,2934,2935,2937,2940],{"class":681,"line":718},[679,2936,2919],{"class":975},[679,2938,2939],{"class":982}," --instance=lobby",[679,2941,2942],{"class":969},"   # named instance\n",[679,2944,2945,2947,2950],{"class":681,"line":738},[679,2946,2919],{"class":975},[679,2948,2949],{"class":982}," --port=9000",[679,2951,2952],{"class":969},"        # custom port\n",[73,2954,1316],{"id":1315},[670,2956,2958],{"className":960,"code":2957,"language":962,"meta":675,"style":675},"systemctl --user enable --now xiboplayer-chromium.service\n",[20,2959,2960],{"__ignoreMap":675},[679,2961,2962,2964,2966,2968,2971],{"class":681,"line":682},[679,2963,1331],{"class":975},[679,2965,1334],{"class":982},[679,2967,1337],{"class":709},[679,2969,2970],{"class":982}," --now",[679,2972,1356],{"class":709},[73,2974,2976],{"id":2975},"configuration","Configuration",[16,2978,2979,2980],{},"Config file: ",[20,2981,63],{},[16,2983,2984,2985,2987],{},"Default server port: ",[938,2986,182],{}," (vs 8765 for Electron — both can run on the same machine).",[16,2989,1819,2990,1716],{},[924,2991,6],{"href":896},[73,2993,2995],{"id":2994},"difference-from-electron","Difference from Electron",[25,2997,2998,3008],{},[28,2999,3000],{},[31,3001,3002,3004,3006],{},[34,3003],{},[34,3005,48],{},[34,3007,58],{},[41,3009,3010,3021,3032,3040,3051,3064],{},[31,3011,3012,3015,3018],{},[46,3013,3014],{},"Browser",[46,3016,3017],{},"Bundled Chromium",[46,3019,3020],{},"System Chromium",[31,3022,3023,3026,3029],{},[46,3024,3025],{},"Package size",[46,3027,3028],{},"~150 MB",[46,3030,3031],{},"~5 MB (noarch)",[31,3033,3034,3036,3038],{},[46,3035,1207],{},[46,3037,179],{},[46,3039,182],{},[31,3041,3042,3045,3048],{},[46,3043,3044],{},"Launcher",[46,3046,3047],{},"Node.js (Electron API)",[46,3049,3050],{},"Bash script",[31,3052,3053,3056,3059],{},[46,3054,3055],{},"Mouse hiding",[46,3057,3058],{},"Native (Electron API)",[46,3060,3061,3063],{},[20,3062,2074],{}," binary",[31,3065,3066,3068,3071],{},[46,3067,2712],{},[46,3069,3070],{},"30 (Electron)",[46,3072,3073],{},"20 (Chromium)",[73,3075,2722],{"id":2721},[932,3077,3078],{},[935,3079,3080],{},[924,3081,3084],{"href":3082,"rel":3083},"https:\u002F\u002Fgithub.com\u002Fxibo-players\u002Fxiboplayer-chromium",[928],"GitHub: xibo-players\u002Fxiboplayer-chromium",[877,3086,2742],{},{"title":675,"searchDepth":718,"depth":718,"links":3088},[3089,3090,3094,3095,3096,3097,3098],{"id":2434,"depth":689,"text":2435},{"id":2244,"depth":689,"text":1506,"children":3091},[3092,3093],{"id":2481,"depth":718,"text":2482},{"id":2511,"depth":718,"text":2512},{"id":2591,"depth":689,"text":2592},{"id":1315,"depth":689,"text":1316},{"id":2975,"depth":689,"text":2976},{"id":2994,"depth":689,"text":2995},{"id":2721,"depth":689,"text":2722},"Lightweight kiosk player using the system Chromium browser",{"order":689},{"title":2762,"description":3099},"docs\u002Fplayers\u002Fchromium","_JxTDLPyw1n1qGplg4Jvn58fQ1zLRjKEZUTP_TwDLQc",{"id":3105,"title":3106,"author":7,"body":3107,"date":7,"description":3520,"extension":893,"meta":3521,"navigation":895,"path":1515,"robots":7,"seo":3522,"stem":3523,"tags":7,"__hash__":3524},"content_en\u002Fdocs\u002Fplayers\u002Felectron.md","Electron Player",{"type":9,"value":3108,"toc":3506},[3109,3112,3115,3117,3162,3164,3166,3190,3192,3253,3255,3306,3308,3325,3327,3331,3336,3338,3387,3391,3411,3415,3419,3464,3467,3479,3481,3504],[12,3110,3106],{"id":3111},"electron-player",[16,3113,3114],{},"Self-contained desktop player that bundles its own Chromium browser. Best for dedicated PCs with GPU acceleration.",[73,3116,2435],{"id":2434},[932,3118,3119,3124,3130,3135,3141,3147,3153],{},[935,3120,3121,3123],{},[938,3122,246],{}," — no window chrome, cursor auto-hide, navigation protection",[935,3125,3126,3129],{},[938,3127,3128],{},"GPU acceleration"," — auto-detects NVIDIA\u002FAMD\u002FIntel GPUs, VAAPI hardware video decode",[935,3131,3132,3134],{},[938,3133,2795],{}," — \u003C8ms precision, 12 choreography effects, mDNS auto-discovery",[935,3136,3137,3140],{},[938,3138,3139],{},"REST API first"," — uses Xibo CMS REST API as primary, SOAP fallback",[935,3142,3143,3146],{},[938,3144,3145],{},"Auto-start on boot"," — systemd user service",[935,3148,3149,3152],{},[938,3150,3151],{},"Offline playback"," — continues from cache when CMS is unreachable",[935,3154,3155,3158,3159,1470],{},[938,3156,3157],{},"Multi-instance"," — run multiple displays on one machine (",[20,3160,3161],{},"--instance=NAME",[73,3163,1506],{"id":2244},[916,3165,2482],{"id":2481},[670,3167,3168],{"className":960,"code":1575,"language":962,"meta":675,"style":675},[20,3169,3170,3180],{"__ignoreMap":675},[679,3171,3172,3174,3176,3178],{"class":681,"line":682},[679,3173,1061],{"class":975},[679,3175,1064],{"class":709},[679,3177,1067],{"class":709},[679,3179,1070],{"class":709},[679,3181,3182,3184,3186,3188],{"class":681,"line":689},[679,3183,1061],{"class":975},[679,3185,1064],{"class":709},[679,3187,1067],{"class":709},[679,3189,1598],{"class":709},[916,3191,2512],{"id":2511},[670,3193,3195],{"className":960,"code":3194,"language":962,"meta":675,"style":675},"curl -fsSL https:\u002F\u002Fdl.xiboplayer.org\u002Fdeb\u002FGPG-KEY.asc | sudo tee \u002Fusr\u002Fshare\u002Fkeyrings\u002Fxiboplayer.asc > \u002Fdev\u002Fnull\necho \"deb [signed-by=\u002Fusr\u002Fshare\u002Fkeyrings\u002Fxiboplayer.asc] https:\u002F\u002Fdl.xiboplayer.org\u002Fdeb\u002Fubuntu\u002F24.04 .\u002F\" | sudo tee \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fxiboplayer.list\nsudo apt update && sudo apt install xiboplayer-electron\n",[20,3196,3197,3217,3235],{"__ignoreMap":675},[679,3198,3199,3201,3203,3205,3207,3209,3211,3213,3215],{"class":681,"line":682},[679,3200,2522],{"class":975},[679,3202,2525],{"class":982},[679,3204,2528],{"class":709},[679,3206,2532],{"class":2531},[679,3208,2535],{"class":975},[679,3210,2538],{"class":709},[679,3212,2541],{"class":709},[679,3214,2544],{"class":2531},[679,3216,2547],{"class":709},[679,3218,3219,3221,3223,3225,3227,3229,3231,3233],{"class":681,"line":689},[679,3220,2552],{"class":1150},[679,3222,706],{"class":705},[679,3224,2879],{"class":709},[679,3226,699],{"class":705},[679,3228,2532],{"class":2531},[679,3230,2535],{"class":975},[679,3232,2538],{"class":709},[679,3234,2568],{"class":709},[679,3236,3237,3239,3241,3243,3245,3247,3249,3251],{"class":681,"line":718},[679,3238,1061],{"class":975},[679,3240,2575],{"class":709},[679,3242,2578],{"class":709},[679,3244,1157],{"class":685},[679,3246,2535],{"class":975},[679,3248,2575],{"class":709},[679,3250,1067],{"class":709},[679,3252,1598],{"class":709},[73,3254,2592],{"id":2591},[670,3256,3258],{"className":960,"code":3257,"language":962,"meta":675,"style":675},"# Normal kiosk mode\nxiboplayer-electron\n\n# Development mode (windowed, DevTools)\nxiboplayer-electron --dev --no-kiosk\n\n# Named instance for video walls\nxiboplayer-electron --instance=lobby\n",[20,3259,3260,3265,3270,3274,3279,3290,3294,3299],{"__ignoreMap":675},[679,3261,3262],{"class":681,"line":682},[679,3263,3264],{"class":969},"# Normal kiosk mode\n",[679,3266,3267],{"class":681,"line":689},[679,3268,3269],{"class":975},"xiboplayer-electron\n",[679,3271,3272],{"class":681,"line":718},[679,3273,1075],{"emptyLinePlaceholder":895},[679,3275,3276],{"class":681,"line":738},[679,3277,3278],{"class":969},"# Development mode (windowed, DevTools)\n",[679,3280,3281,3284,3287],{"class":681,"line":758},[679,3282,3283],{"class":975},"xiboplayer-electron",[679,3285,3286],{"class":982}," --dev",[679,3288,3289],{"class":982}," --no-kiosk\n",[679,3291,3292],{"class":681,"line":775},[679,3293,1075],{"emptyLinePlaceholder":895},[679,3295,3296],{"class":681,"line":794},[679,3297,3298],{"class":969},"# Named instance for video walls\n",[679,3300,3301,3303],{"class":681,"line":813},[679,3302,3283],{"class":975},[679,3304,3305],{"class":982}," --instance=lobby\n",[73,3307,1316],{"id":1315},[670,3309,3311],{"className":960,"code":3310,"language":962,"meta":675,"style":675},"systemctl --user enable --now xiboplayer-electron.service\n",[20,3312,3313],{"__ignoreMap":675},[679,3314,3315,3317,3319,3321,3323],{"class":681,"line":682},[679,3316,1331],{"class":975},[679,3318,1334],{"class":982},[679,3320,1337],{"class":709},[679,3322,2970],{"class":982},[679,3324,1340],{"class":709},[73,3326,2976],{"id":2975},[16,3328,2979,3329],{},[20,3330,53],{},[16,3332,1819,3333,3335],{},[924,3334,6],{"href":896}," for all options.",[73,3337,558],{"id":557},[25,3339,3340,3348],{},[28,3341,3342],{},[31,3343,3344,3346],{},[34,3345,85],{},[34,3347,572],{},[41,3349,3350,3359,3368,3377],{},[31,3351,3352,3356],{},[46,3353,3354],{},[20,3355,581],{},[46,3357,3358],{},"Toggle download overlay",[31,3360,3361,3365],{},[46,3362,3363],{},[20,3364,591],{},[46,3366,3367],{},"Toggle timeline overlay",[31,3369,3370,3374],{},[46,3371,3372],{},[20,3373,601],{},[46,3375,3376],{},"Toggle setup overlay",[31,3378,3379,3384],{},[46,3380,3381],{},[20,3382,3383],{},"Ctrl+Shift+F12",[46,3385,3386],{},"System tray menu",[73,3388,3390],{"id":3389},"logs","Logs",[670,3392,3394],{"className":960,"code":3393,"language":962,"meta":675,"style":675},"journalctl --user -u xiboplayer-electron -f\n",[20,3395,3396],{"__ignoreMap":675},[679,3397,3398,3401,3403,3406,3408],{"class":681,"line":682},[679,3399,3400],{"class":975},"journalctl",[679,3402,1334],{"class":982},[679,3404,3405],{"class":982}," -u",[679,3407,1091],{"class":709},[679,3409,3410],{"class":982}," -f\n",[73,3412,3414],{"id":3413},"gpu-detection","GPU detection",[16,3416,398,3417,702],{},[20,3418,401],{},[25,3420,3421,3433],{},[28,3422,3423],{},[31,3424,3425,3428,3430],{},[34,3426,3427],{},"Vendor",[34,3429,1971],{},[34,3431,3432],{},"VA-API driver",[41,3434,3435,3444,3454],{},[31,3436,3437,3440,3442],{},[46,3438,3439],{},"NVIDIA",[46,3441,1984],{},[46,3443,385],{},[31,3445,3446,3449,3451],{},[46,3447,3448],{},"AMD",[46,3450,1996],{},[46,3452,3453],{},"radeonsi",[31,3455,3456,3459,3461],{},[46,3457,3458],{},"Intel",[46,3460,88],{},[46,3462,3463],{},"iHD",[16,3465,3466],{},"On hybrid GPU systems (Optimus\u002FPRIME), it selects the GPU with display connectors.",[16,3468,3469,3470,382,3473,382,3476],{},"Override: ",[20,3471,3472],{},"--gpu=nvidia",[20,3474,3475],{},"--gpu=intel",[20,3477,3478],{},"--gpu=\u002Fdev\u002Fdri\u002FrenderD129",[73,3480,2722],{"id":2721},[932,3482,3483,3490],{},[935,3484,3485],{},[924,3486,3489],{"href":3487,"rel":3488},"https:\u002F\u002Fgithub.com\u002Fxibo-players\u002Fxiboplayer-electron",[928],"GitHub: xibo-players\u002Fxiboplayer-electron",[935,3491,3492,3493,3498,3499],{},"Packages: ",[924,3494,3497],{"href":3495,"rel":3496},"https:\u002F\u002Fdl.xiboplayer.org\u002Frpm\u002F",[928],"RPM"," \u002F ",[924,3500,3503],{"href":3501,"rel":3502},"https:\u002F\u002Fdl.xiboplayer.org\u002Fdeb\u002F",[928],"DEB",[877,3505,2742],{},{"title":675,"searchDepth":718,"depth":718,"links":3507},[3508,3509,3513,3514,3515,3516,3517,3518,3519],{"id":2434,"depth":689,"text":2435},{"id":2244,"depth":689,"text":1506,"children":3510},[3511,3512],{"id":2481,"depth":718,"text":2482},{"id":2511,"depth":718,"text":2512},{"id":2591,"depth":689,"text":2592},{"id":1315,"depth":689,"text":1316},{"id":2975,"depth":689,"text":2976},{"id":557,"depth":689,"text":558},{"id":3389,"depth":689,"text":3390},{"id":3413,"depth":689,"text":3414},{"id":2721,"depth":689,"text":2722},"Full-featured desktop signage player with built-in Chromium, GPU acceleration, and kiosk mode",{"order":682},{"title":3106,"description":3520},"docs\u002Fplayers\u002Felectron","fp1BdsllNuNJMrR7j8Q1CVCgJnYyEs8msbg5XHdNNh0",{"id":3526,"title":3527,"author":7,"body":3528,"date":7,"description":4079,"extension":893,"meta":4080,"navigation":895,"path":1545,"robots":7,"seo":4081,"stem":4082,"tags":7,"__hash__":4083},"content_en\u002Fdocs\u002Fplayers\u002Fkiosk.md","Kiosk Images",{"type":9,"value":3529,"toc":4058},[3530,3533,3536,3540,3649,3653,3659,3663,3669,3671,3694,3696,3704,3717,3720,3725,3729,3735,3758,3760,3763,3807,3813,3815,3858,3860,3877,3882,3886,3893,3908,3912,3915,3919,3952,3956,4007,4009,4020,4024,4027,4033,4037,4047,4049],[12,3531,3527],{"id":3532},"kiosk-images",[16,3534,3535],{},"Pre-built bootable images that turn any PC or Raspberry Pi into a dedicated signage display. Flash to USB or SD card, boot, and the player starts automatically.",[73,3537,3539],{"id":3538},"image-types","Image types",[25,3541,3542,3555],{},[28,3543,3544],{},[31,3545,3546,3549,3552],{},[34,3547,3548],{},"Type",[34,3550,3551],{},"Format",[34,3553,3554],{},"Use case",[41,3556,3557,3572,3586,3605,3620,3633],{},[31,3558,3559,3564,3569],{},[46,3560,3561],{},[938,3562,3563],{},"Offline ISO",[46,3565,3566],{},[20,3567,3568],{},".iso",[46,3570,3571],{},"Full install with all packages included, no network needed",[31,3573,3574,3579,3583],{},[46,3575,3576],{},[938,3577,3578],{},"Netinstall ISO",[46,3580,3581],{},[20,3582,3568],{},[46,3584,3585],{},"Minimal installer, downloads packages during install",[31,3587,3588,3593,3598],{},[46,3589,3590],{},[938,3591,3592],{},"Disk image",[46,3594,3595],{},[20,3596,3597],{},".raw.xz",[46,3599,3600,3601,3604],{},"Flash directly to USB\u002FSD with ",[20,3602,3603],{},"dd"," or Raspberry Pi Imager",[31,3606,3607,3612,3617],{},[46,3608,3609],{},[938,3610,3611],{},"QCOW2",[46,3613,3614],{},[20,3615,3616],{},".qcow2",[46,3618,3619],{},"Virtual machines (libvirt, QEMU)",[31,3621,3622,3627,3630],{},[46,3623,3624],{},[938,3625,3626],{},"Atomic",[46,3628,3629],{},"OCI container → ISO",[46,3631,3632],{},"Immutable fedora-bootc with automatic rollback",[31,3634,3635,3640,3646],{},[46,3636,3637],{},[938,3638,3639],{},"iPXE Network Install",[46,3641,3642,3645],{},[20,3643,3644],{},".usb"," (~1 MB)",[46,3647,3648],{},"Boot any machine from the internet — no ISO needed",[73,3650,3652],{"id":3651},"download","Download",[16,3654,3655,3656,3658],{},"See the ",[924,3657,1193],{"href":1192}," page for the latest images.",[73,3660,3662],{"id":3661},"boot-flow","Boot flow",[670,3664,3667],{"className":3665,"code":3666,"language":1307},[1305],"GDM autologin as 'xibo'\n  → GNOME Kiosk session starts\n    → Phase 1: gnome-initial-setup (language, keyboard, network, timezone, password)\n    → Phase 2: xiboplayer-setup (libadwaita wizard — player selection + CMS config)\n    → Phase 3: Selected player service starts, health monitoring begins\n  → Normal boot (setup already done):\n    → Player starts automatically with 10s health check loop\n",[20,3668,3666],{"__ignoreMap":675},[916,3670,1896],{"id":1895},[16,3672,3673,3674,3676,3677,382,3680,382,3683,382,3686,3689,3690,3693],{},"On first boot, the standard GNOME initial setup wizard runs. A ",[20,3675,1902],{}," skips the account, privacy, and welcome pages — only ",[938,3678,3679],{},"language",[938,3681,3682],{},"keyboard",[938,3684,3685],{},"network",[938,3687,3688],{},"timezone",", and ",[938,3691,3692],{},"password"," remain.",[916,3695,1942],{"id":1941},[16,3697,1945,3698,3700,3701,3703],{},[938,3699,1948],{}," wizard (",[20,3702,1952],{},") launches with:",[1646,3705,3706,3711],{},[935,3707,3708,3710],{},[938,3709,1957],{}," — choose Electron, Chromium, or arexibo",[935,3712,3713,3716],{},[938,3714,3715],{},"CMS configuration"," (arexibo only) — CMS URL and key entry",[16,3718,3719],{},"For Electron and Chromium, CMS configuration happens in the player's own web-based setup page (served by the built-in proxy after the player starts).",[16,3721,2054,3722,3724],{},[20,3723,1888],{}," with the selected player and service name, then the selected player's systemd service starts automatically.",[916,3726,3728],{"id":3727},"phase-3-session-holder","Phase 3: Session holder",[16,3730,3731,3732,3734],{},"The main kiosk session (",[20,3733,2061],{},") takes over:",[1646,3736,3737,3743,3746,3749,3752,3755],{},[935,3738,2067,3739,2071,3741,2075],{},[20,3740,2070],{},[20,3742,2074],{},[935,3744,3745],{},"Imports Wayland environment into systemd user manager",[935,3747,3748],{},"Disables screen blanking and GNOME donation popup",[935,3750,3751],{},"Starts the player service",[935,3753,3754],{},"Runs a health monitoring loop (checks every 10 seconds)",[935,3756,3757],{},"Offers reconfiguration dialog after 3 consecutive failures",[73,3759,1957],{"id":1956},[16,3761,3762],{},"The kiosk includes all three players. The first-boot wizard lets you choose:",[25,3764,3765,3775],{},[28,3766,3767],{},[31,3768,3769,3771,3773],{},[34,3770,1500],{},[34,3772,1971],{},[34,3774,1503],{},[41,3776,3777,3787,3797],{},[31,3778,3779,3781,3784],{},[46,3780,48],{},[46,3782,3783],{},"30 (highest)",[46,3785,3786],{},"PCs with GPU",[31,3788,3789,3791,3794],{},[46,3790,58],{},[46,3792,3793],{},"20",[46,3795,3796],{},"Lightweight hardware",[31,3798,3799,3801,3804],{},[46,3800,2006],{},[46,3802,3803],{},"10",[46,3805,3806],{},"Native Rust rendering",[16,3808,3809,3810],{},"Switch later without reconfiguring CMS: ",[20,3811,3812],{},"doas alternatives --set xiboplayer \u002Fusr\u002Fbin\u002Fxiboplayer-chromium",[73,3814,558],{"id":557},[25,3816,3817,3825],{},[28,3818,3819],{},[31,3820,3821,3823],{},[34,3822,85],{},[34,3824,572],{},[41,3826,3827,3836,3845],{},[31,3828,3829,3833],{},[46,3830,3831],{},[20,3832,611],{},[46,3834,3835],{},"Show IP, CMS URL, player status",[31,3837,3838,3842],{},[46,3839,3840],{},[20,3841,621],{},[46,3843,3844],{},"Reconfigure CMS (stops player, launches wizard)",[31,3846,3847,3855],{},[46,3848,3849,3498,3851,3498,3853],{},[20,3850,581],{},[20,3852,591],{},[20,3854,601],{},[46,3856,3857],{},"Download \u002F Timeline \u002F Setup overlays",[73,3859,2136],{"id":2135},[932,3861,3862,3872],{},[935,3863,3864,2147,3866,3498,3868,2147,3870],{},[938,3865,2146],{},[20,3867,1871],{},[938,3869,1934],{},[20,3871,1871],{},[935,3873,3874,3876],{},[938,3875,2160],{},": locked",[16,3878,3879,3880],{},"Change after first boot: ",[20,3881,2167],{},[73,3883,3885],{"id":3884},"atomic-images","Atomic images",[16,3887,3888,3889,3892],{},"Atomic images are built on ",[938,3890,3891],{},"fedora-bootc"," — a minimal immutable base (~1.5 GB, vs 2.5 GB for Silverblue):",[932,3894,3895,3898,3902,3905],{},[935,3896,3897],{},"Immutable OS — cannot be accidentally modified",[935,3899,2182,3900,2186],{},[20,3901,2185],{},[935,3903,3904],{},"Container-native — built as OCI image, converted to ISO",[935,3906,3907],{},"Minimal: no Firefox, no VLC, no unused GNOME apps",[73,3909,3911],{"id":3910},"ipxe-network-install","iPXE network install",[16,3913,3914],{},"A ~1 MB USB stick that boots any machine over the internet and installs xiboplayer. No ISO needed — one stick installs unlimited machines.",[916,3916,3918],{"id":3917},"how-it-works","How it works",[1646,3920,3921,3931,3937,3940,3943,3946,3949],{},[935,3922,3923,3924,3927,3928,3930],{},"Download ",[20,3925,3926],{},"xiboplayer-ipxe-bios.img"," from the ",[924,3929,1193],{"href":1192}," page",[935,3932,3933,3934],{},"Flash to any USB stick: ",[20,3935,3936],{},"sudo dd if=xiboplayer-ipxe-bios.img of=\u002Fdev\u002FsdX bs=4M",[935,3938,3939],{},"Boot the target machine from USB",[935,3941,3942],{},"A menu appears — choose Full, Electron-only, or Chromium-only",[935,3944,3945],{},"iPXE downloads the Fedora kernel + kickstart over the internet",[935,3947,3948],{},"Anaconda installs everything automatically (~15-20 min)",[935,3950,3951],{},"Machine reboots into the kiosk first-boot wizard",[916,3953,3955],{"id":3954},"install-profiles","Install profiles",[25,3957,3958,3970],{},[28,3959,3960],{},[31,3961,3962,3965,3968],{},[34,3963,3964],{},"Profile",[34,3966,3967],{},"What's installed",[34,3969,1503],{},[41,3971,3972,3985,3996],{},[31,3973,3974,3979,3982],{},[46,3975,3976],{},[938,3977,3978],{},"Full",[46,3980,3981],{},"Electron + Chromium + arexibo",[46,3983,3984],{},"Maximum flexibility",[31,3986,3987,3991,3994],{},[46,3988,3989],{},[938,3990,48],{},[46,3992,3993],{},"Electron only",[46,3995,1518],{},[31,3997,3998,4002,4005],{},[46,3999,4000],{},[938,4001,58],{},[46,4003,4004],{},"Chromium only",[46,4006,3796],{},[916,4008,1016],{"id":1015},[932,4010,4011,4014,4017],{},[935,4012,4013],{},"Ethernet or Wi-Fi (internet needed during install)",[935,4015,4016],{},"BIOS or UEFI with USB boot",[935,4018,4019],{},"20 GB+ disk",[916,4021,4023],{"id":4022},"chainloading-from-existing-ipxe","Chainloading from existing iPXE",[16,4025,4026],{},"If you already have iPXE on your network:",[670,4028,4031],{"className":4029,"code":4030,"language":1307},[1305],"chain https:\u002F\u002Fdl.xiboplayer.org\u002Fipxe\u002Fboot.ipxe\n",[20,4032,4030],{"__ignoreMap":675},[916,4034,4036],{"id":4035},"efi-boot","EFI boot",[16,4038,4039,4040,4043,4044,1716],{},"For UEFI-only machines, download ",[20,4041,4042],{},"xiboplayer-ipxe-uefi.img"," and boot it from the EFI shell or place it on a FAT32 USB as ",[20,4045,4046],{},"EFI\u002FBOOT\u002FBOOTX64.EFI",[73,4048,2722],{"id":2721},[932,4050,4051],{},[935,4052,4053],{},[924,4054,4057],{"href":4055,"rel":4056},"https:\u002F\u002Fgithub.com\u002Fxibo-players\u002Fxiboplayer-kiosk",[928],"GitHub: xibo-players\u002Fxiboplayer-kiosk",{"title":675,"searchDepth":718,"depth":718,"links":4059},[4060,4061,4062,4067,4068,4069,4070,4071,4078],{"id":3538,"depth":689,"text":3539},{"id":3651,"depth":689,"text":3652},{"id":3661,"depth":689,"text":3662,"children":4063},[4064,4065,4066],{"id":1895,"depth":718,"text":1896},{"id":1941,"depth":718,"text":1942},{"id":3727,"depth":718,"text":3728},{"id":1956,"depth":689,"text":1957},{"id":557,"depth":689,"text":558},{"id":2135,"depth":689,"text":2136},{"id":3884,"depth":689,"text":3885},{"id":3910,"depth":689,"text":3911,"children":4072},[4073,4074,4075,4076,4077],{"id":3917,"depth":718,"text":3918},{"id":3954,"depth":718,"text":3955},{"id":1015,"depth":718,"text":1016},{"id":4022,"depth":718,"text":4023},{"id":4035,"depth":718,"text":4036},{"id":2721,"depth":689,"text":2722},"Pre-built bootable images for PCs and Raspberry Pi — flash, boot, and display",{"order":718},{"title":3527,"description":4079},"docs\u002Fplayers\u002Fkiosk","oHoHUmyntQeyPonNzpvrqf2S47N_4Oxz26AWJob9aMY",{"id":4085,"title":4086,"author":7,"body":4087,"date":7,"description":4379,"extension":893,"meta":4380,"navigation":895,"path":1560,"robots":7,"seo":4381,"stem":4382,"tags":7,"__hash__":4383},"content_en\u002Fdocs\u002Fplayers\u002Fpwa.md","PWA Player",{"type":9,"value":4088,"toc":4367},[4089,4092,4095,4097,4135,4139,4146,4150,4213,4219,4223,4242,4246,4249,4251,4287,4291,4297,4301,4333,4342,4344,4364],[12,4090,4086],{"id":4091},"pwa-player",[16,4093,4094],{},"The PWA (Progressive Web App) is the rendering engine that powers all xiboplayer platforms. It can also run standalone in any modern browser.",[73,4096,2435],{"id":2434},[932,4098,4099,4105,4111,4117,4123,4129],{},[935,4100,4101,4104],{},[938,4102,4103],{},"Runs anywhere"," — Chrome, Firefox, Edge, or any Chromium-based browser",[935,4106,4107,4110],{},[938,4108,4109],{},"Offline-first"," — Service Worker caches all media for offline playback",[935,4112,4113,4116],{},[938,4114,4115],{},"All widget types"," — video (MP4, HLS), images, PDF, text\u002Ftickers, web pages, clock, calendar",[935,4118,4119,4122],{},[938,4120,4121],{},"Interactive actions"," — touch\u002Fclick triggers, keyboard navigation, layout jumps",[935,4124,4125,4128],{},[938,4126,4127],{},"Proof of play"," — per-layout and per-widget duration tracking",[935,4130,4131,4134],{},[938,4132,4133],{},"Zero install"," — just open a URL",[73,4136,4138],{"id":4137},"deployment","Deployment",[16,4140,4141,4142,4145],{},"The PWA must be served from the ",[938,4143,4144],{},"same origin"," as the CMS (same-origin policy for API calls). Two options:",[916,4147,4149],{"id":4148},"option-a-deploy-to-cms-container","Option A: Deploy to CMS container",[670,4151,4153],{"className":960,"code":4152,"language":962,"meta":675,"style":675},"# Build from source\ngit clone https:\u002F\u002Fgithub.com\u002Fxibo-players\u002Fxiboplayer.git\ncd xiboplayer && pnpm install\npnpm --filter @xiboplayer\u002Fpwa build\n\n# Copy to CMS web root\npodman cp packages\u002Fpwa\u002Fdist\u002F. xibo-cms-web:\u002Fvar\u002Fwww\u002Fcms\u002Fweb\u002Fchromeos\u002F\n",[20,4154,4155,4160,4168,4180,4190,4194,4199],{"__ignoreMap":675},[679,4156,4157],{"class":681,"line":682},[679,4158,4159],{"class":969},"# Build from source\n",[679,4161,4162,4164,4166],{"class":681,"line":689},[679,4163,1139],{"class":975},[679,4165,1142],{"class":709},[679,4167,1145],{"class":709},[679,4169,4170,4172,4174,4176,4178],{"class":681,"line":718},[679,4171,1151],{"class":1150},[679,4173,1154],{"class":709},[679,4175,1157],{"class":685},[679,4177,1160],{"class":975},[679,4179,1163],{"class":709},[679,4181,4182,4184,4186,4188],{"class":681,"line":738},[679,4183,1168],{"class":975},[679,4185,1171],{"class":982},[679,4187,1174],{"class":709},[679,4189,1177],{"class":709},[679,4191,4192],{"class":681,"line":758},[679,4193,1075],{"emptyLinePlaceholder":895},[679,4195,4196],{"class":681,"line":775},[679,4197,4198],{"class":969},"# Copy to CMS web root\n",[679,4200,4201,4204,4207,4210],{"class":681,"line":794},[679,4202,4203],{"class":975},"podman",[679,4205,4206],{"class":709}," cp",[679,4208,4209],{"class":709}," packages\u002Fpwa\u002Fdist\u002F.",[679,4211,4212],{"class":709}," xibo-cms-web:\u002Fvar\u002Fwww\u002Fcms\u002Fweb\u002Fchromeos\u002F\n",[16,4214,4215,4216],{},"Access at: ",[20,4217,4218],{},"https:\u002F\u002Fyour-cms.example.com\u002Fplayer\u002F",[916,4220,4222],{"id":4221},"option-b-via-ansible","Option B: Via Ansible",[670,4224,4226],{"className":960,"code":4225,"language":962,"meta":675,"style":675},"ansible-playbook playbooks\u002Fservices\u002Fdeploy-pwa.yml -e target_host=h1.example.com\n",[20,4227,4228],{"__ignoreMap":675},[679,4229,4230,4233,4236,4239],{"class":681,"line":682},[679,4231,4232],{"class":975},"ansible-playbook",[679,4234,4235],{"class":709}," playbooks\u002Fservices\u002Fdeploy-pwa.yml",[679,4237,4238],{"class":982}," -e",[679,4240,4241],{"class":709}," target_host=h1.example.com\n",[916,4243,4245],{"id":4244},"option-c-electron-chromium-wrapper","Option C: Electron \u002F Chromium wrapper",[16,4247,4248],{},"The Electron and Chromium players serve the PWA via a built-in Express proxy, avoiding the same-origin constraint. This is the recommended approach for kiosk deployments.",[73,4250,558],{"id":557},[25,4252,4253,4261],{},[28,4254,4255],{},[31,4256,4257,4259],{},[34,4258,85],{},[34,4260,572],{},[41,4262,4263,4271,4279],{},[31,4264,4265,4269],{},[46,4266,4267],{},[20,4268,581],{},[46,4270,584],{},[31,4272,4273,4277],{},[46,4274,4275],{},[20,4276,591],{},[46,4278,594],{},[31,4280,4281,4285],{},[46,4282,4283],{},[20,4284,601],{},[46,4286,604],{},[73,4288,4290],{"id":4289},"how-it-works-with-electron-chromium","How it works with Electron \u002F Chromium",[670,4292,4295],{"className":4293,"code":4294,"language":1307},[1305],"Player wrapper\n  └── Express proxy (localhost:8765)\n        ├── \u002Fplayer\u002F         → serves PWA dist files\n        ├── \u002Fxmds-proxy     → forwards SOAP to CMS\n        ├── \u002Fapi\u002F*           → forwards REST to CMS\n        └── \u002Fstore\u002F*         → ContentStore filesystem\n              ↓\n        PWA loads from localhost\n        Service Worker caches everything\n        Offline playback from local store\n",[20,4296,4294],{"__ignoreMap":675},[73,4298,4300],{"id":4299},"limitations-standalone-browser-mode","Limitations (standalone browser mode)",[932,4302,4303,4309,4315,4321,4327],{},[935,4304,4305,4308],{},[938,4306,4307],{},"Same-origin required"," — must be hosted on CMS domain",[935,4310,4311,4314],{},[938,4312,4313],{},"No kiosk mode"," — browser controls remain visible",[935,4316,4317,4320],{},[938,4318,4319],{},"No GPU detection"," — uses browser defaults",[935,4322,4323,4326],{},[938,4324,4325],{},"No system integration"," — no auto-start, no power management",[935,4328,4329,4332],{},[938,4330,4331],{},"Storage limits"," — browser storage quotas apply (typically 50% of disk)",[16,4334,4335,4336,4338,4339,4341],{},"For production kiosk deployments, use the ",[924,4337,48],{"href":1515}," or ",[924,4340,58],{"href":1530}," wrapper instead.",[73,4343,2722],{"id":2721},[932,4345,4346,4357],{},[935,4347,4348,4353,4354,1470],{},[924,4349,4352],{"href":4350,"rel":4351},"https:\u002F\u002Fgithub.com\u002Fxibo-players\u002Fxiboplayer",[928],"GitHub: xibo-players\u002Fxiboplayer"," (",[20,4355,4356],{},"packages\u002Fpwa\u002F",[935,4358,4359],{},[924,4360,4363],{"href":4361,"rel":4362},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@xiboplayer\u002Fpwa",[928],"npm: @xiboplayer\u002Fpwa",[877,4365,4366],{},"html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sptTA, html code.shiki .sptTA{--shiki-light:#6182B8;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .stzsN, html code.shiki .stzsN{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":675,"searchDepth":718,"depth":718,"links":4368},[4369,4370,4375,4376,4377,4378],{"id":2434,"depth":689,"text":2435},{"id":4137,"depth":689,"text":4138,"children":4371},[4372,4373,4374],{"id":4148,"depth":718,"text":4149},{"id":4221,"depth":718,"text":4222},{"id":4244,"depth":718,"text":4245},{"id":557,"depth":689,"text":558},{"id":4289,"depth":689,"text":4290},{"id":4299,"depth":689,"text":4300},{"id":2721,"depth":689,"text":2722},"Browser-based signage player that runs anywhere — the rendering engine behind all xiboplayer platforms",{"order":758},{"title":4086,"description":4379},"docs\u002Fplayers\u002Fpwa","FGxTIpGbsSMSzkOEVinYHoIS8M9MY_yBebZk2rGI7M8",{"id":4385,"title":4386,"author":7,"body":4387,"date":7,"description":4635,"extension":893,"meta":4636,"navigation":895,"path":4637,"robots":7,"seo":4638,"stem":4639,"tags":7,"__hash__":4640},"content_en\u002Fdocs\u002Fsdk\u002Farchitecture.md","SDK Architecture",{"type":9,"value":4388,"toc":4623},[4389,4392,4395,4399,4405,4409,4415,4419,4423,4433,4437,4447,4451,4457,4461,4477,4481,4484,4495,4578,4582,4585,4620],[12,4390,4386],{"id":4391},"sdk-architecture",[16,4393,4394],{},"The xiboplayer SDK is a modular JavaScript library organized as a pnpm monorepo. Each package handles one concern — combine them to build a full player, or use individual packages in your own projects.",[73,4396,4398],{"id":4397},"package-dependency-graph","Package dependency graph",[670,4400,4403],{"className":4401,"code":4402,"language":1307},[1305],"@xiboplayer\u002Fcrypto\n  └── @xiboplayer\u002Futils (logger, EventEmitter, config, fetchWithRetry)\n        ├── @xiboplayer\u002Fschedule (campaigns, dayparting, timeline)\n        │     └── @xiboplayer\u002Frenderer (XLF rendering, transitions, LayoutPool)\n        ├── @xiboplayer\u002Fcache (offline storage, chunked downloads)\n        │     └── @xiboplayer\u002Fsw (Service Worker)\n        ├── @xiboplayer\u002Fxmds (SOAP + REST CMS client)\n        ├── @xiboplayer\u002Fxmr (WebSocket push commands)\n        ├── @xiboplayer\u002Fsettings (display settings from CMS)\n        ├── @xiboplayer\u002Fstats (proof of play, log reporting)\n        ├── @xiboplayer\u002Fsync (multi-display video walls)\n        └── @xiboplayer\u002Fproxy (Express CORS proxy + PWA server)\n\n@xiboplayer\u002Fcore (orchestration — peerDeps on cache, renderer, schedule, xmds)\n@xiboplayer\u002Fpwa (TypeScript platform layer for browsers)\n",[20,4404,4402],{"__ignoreMap":675},[73,4406,4408],{"id":4407},"data-flow","Data flow",[670,4410,4413],{"className":4411,"code":4412,"language":1307},[1305],"CMS Server\n  ↓ XMDS (SOAP\u002FREST)\n@xiboplayer\u002Fxmds → RegisterDisplay, RequiredFiles, Schedule, GetResource\n  ↓\n@xiboplayer\u002Fcore (PlayerCore)\n  ├── Parses schedule → @xiboplayer\u002Fschedule\n  ├── Downloads media → @xiboplayer\u002Fcache + DownloadManager\n  ├── Renders layouts → @xiboplayer\u002Frenderer (RendererLite)\n  ├── Reports stats → @xiboplayer\u002Fstats\n  └── Listens for push → @xiboplayer\u002Fxmr (XMR WebSocket)\n  ↓\nPlatform Layer (PWA \u002F Electron \u002F Chromium \u002F Android \u002F webOS)\n  → Displays content on screen\n",[20,4414,4412],{"__ignoreMap":675},[73,4416,4418],{"id":4417},"key-design-decisions","Key design decisions",[916,4420,4422],{"id":4421},"peer-dependencies-for-core","Peer dependencies for core",[16,4424,4425,4428,4429,4432],{},[20,4426,4427],{},"@xiboplayer\u002Fcore"," uses ",[20,4430,4431],{},"peerDependencies"," for its heavy modules (cache, renderer, schedule, xmds). This means the platform layer — not core — controls which versions are wired together. It prevents version conflicts and allows the same core to work across different platform setups.",[916,4434,4436],{"id":4435},"dual-cms-transport","Dual CMS transport",[16,4438,1881,4439,4442,4443,4446],{},[20,4440,4441],{},"@xiboplayer\u002Fxmds"," package supports both SOAP (traditional Xibo protocol) and REST (lighter JSON transport). A ",[20,4444,4445],{},"ProtocolDetector"," probes the CMS at startup and auto-selects the best transport. Both expose the same method names.",[916,4448,4450],{"id":4449},"offline-first-architecture","Offline-first architecture",[16,4452,1881,4453,4456],{},[20,4454,4455],{},"@xiboplayer\u002Fcache"," package stores all media and schedule data locally. The player can continue operating indefinitely when the CMS is unreachable, replaying the last-known schedule from its local cache.",[916,4458,4460],{"id":4459},"event-driven-orchestration","Event-driven orchestration",[16,4462,4463,4464,382,4467,382,4470,382,4473,4476],{},"PlayerCore communicates with the platform layer entirely through events. It never manipulates the DOM or makes platform-specific calls. Events include ",[20,4465,4466],{},"collection-start",[20,4468,4469],{},"layout-ready",[20,4471,4472],{},"download-request",[20,4474,4475],{},"layout-blacklisted",", and more. This makes it reusable across PWA, Electron, Chromium, Android, and webOS.",[73,4478,4480],{"id":4479},"platform-wrappers","Platform wrappers",[16,4482,4483],{},"Each platform wrapper provides:",[1646,4485,4486,4489,4492],{},[935,4487,4488],{},"A way to serve the PWA (Express server for Electron\u002FChromium, asset loader for Android, Luna service for webOS)",[935,4490,4491],{},"CORS proxying for CMS API calls",[935,4493,4494],{},"Platform-specific features (GPU acceleration, power management, kiosk mode)",[25,4496,4497,4511],{},[28,4498,4499],{},[31,4500,4501,4503,4506,4508],{},[34,4502,36],{},[34,4504,4505],{},"Server",[34,4507,1207],{},[34,4509,4510],{},"Special features",[41,4512,4513,4525,4539,4552,4565],{},[31,4514,4515,4517,4520,4522],{},[46,4516,68],{},[46,4518,4519],{},"Browser (Service Worker)",[46,4521,103],{},[46,4523,4524],{},"Offline via SW, works in any browser",[31,4526,4527,4529,4534,4536],{},[46,4528,48],{},[46,4530,4531,4532],{},"Express via ",[20,4533,1270],{},[46,4535,179],{},[46,4537,4538],{},"GPU detection, IPC, auto-launch, tray",[31,4540,4541,4543,4547,4549],{},[46,4542,58],{},[46,4544,4531,4545],{},[20,4546,1270],{},[46,4548,182],{},[46,4550,4551],{},"Bash launcher, system Chromium",[31,4553,4554,4557,4560,4562],{},[46,4555,4556],{},"Android",[46,4558,4559],{},"WebViewAssetLoader",[46,4561,103],{},[46,4563,4564],{},"DPM kiosk, foreground service",[31,4566,4567,4570,4573,4575],{},[46,4568,4569],{},"webOS",[46,4571,4572],{},"Luna native service",[46,4574,179],{},[46,4576,4577],{},"ActivityManager keep-alive",[73,4579,4581],{"id":4580},"testing","Testing",[16,4583,4584],{},"The SDK has 1744 unit tests across 54 test suites (Vitest + jsdom). Integration tests run nightly against a dev CMS instance. The PWA has Playwright e2e tests with a mock CMS.",[670,4586,4588],{"className":960,"code":4587,"language":962,"meta":675,"style":675},"pnpm test              # unit tests\npnpm lint              # Biome linter\npnpm test:coverage     # with thresholds (50% lines, 40% branches)\n",[20,4589,4590,4600,4610],{"__ignoreMap":675},[679,4591,4592,4594,4597],{"class":681,"line":682},[679,4593,1168],{"class":975},[679,4595,4596],{"class":709}," test",[679,4598,4599],{"class":969},"              # unit tests\n",[679,4601,4602,4604,4607],{"class":681,"line":689},[679,4603,1168],{"class":975},[679,4605,4606],{"class":709}," lint",[679,4608,4609],{"class":969},"              # Biome linter\n",[679,4611,4612,4614,4617],{"class":681,"line":718},[679,4613,1168],{"class":975},[679,4615,4616],{"class":709}," test:coverage",[679,4618,4619],{"class":969},"     # with thresholds (50% lines, 40% branches)\n",[877,4621,4622],{},"html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":675,"searchDepth":718,"depth":718,"links":4624},[4625,4626,4627,4633,4634],{"id":4397,"depth":689,"text":4398},{"id":4407,"depth":689,"text":4408},{"id":4417,"depth":689,"text":4418,"children":4628},[4629,4630,4631,4632],{"id":4421,"depth":718,"text":4422},{"id":4435,"depth":718,"text":4436},{"id":4449,"depth":718,"text":4450},{"id":4459,"depth":718,"text":4460},{"id":4479,"depth":689,"text":4480},{"id":4580,"depth":689,"text":4581},"How the xiboplayer SDK packages work together",{"order":682},"\u002Fdocs\u002Fsdk\u002Farchitecture",{"title":4386,"description":4635},"docs\u002Fsdk\u002Farchitecture","4cX0YbgtftdE0DKEdFlu9ZPF4uZQjd3cBFxhPuxVHB8",{"id":4642,"title":4643,"author":7,"body":4644,"date":7,"description":5488,"extension":893,"meta":5489,"navigation":895,"path":5490,"robots":7,"seo":5491,"stem":5492,"tags":7,"__hash__":5493},"content_en\u002Fdocs\u002Fsdk\u002Fcomparison.md","Feature Comparison",{"type":9,"value":4645,"toc":5481},[4646,4650,4660,4665,4696,4699,4703,4881,4886,4888,4892,5091,5093,5097,5100,5216,5221,5244,5246,5250,5436,5438,5442,5445,5479],[12,4647,4649],{"id":4648},"feature-comparison-xiboplayer-v0713-vs-upstream-players","Feature Comparison: XiboPlayer v0.7.13 vs Upstream Players",[16,4651,4652,4655,4656,4659],{},[938,4653,4654],{},"Last Updated:"," 2026-03-30\n",[938,4657,4658],{},"Our Version:"," v0.7.13 (SDK v0.7.13, PWA v0.7.13, Electron v0.7.13, Chromium v0.7.13)",[16,4661,4662],{},[938,4663,4664],{},"Compared against:",[932,4666,4667,4673,4681,4689],{},[935,4668,4669,4672],{},[679,4670,4671],{},"xibo-layout-renderer"," v1.0.24 (npm, 2026-03-30) — rendering library used in Xibo's Electron\u002FChromeOS players",[935,4674,4675,4680],{},[924,4676,4679],{"href":4677,"rel":4678},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@xibosignage\u002Fxibo-communication-framework",[928],"xibo-communication-framework"," v0.0.7 (npm, 2026-03-30) — upstream XMR client (replaced by our native implementation)",[935,4682,4683,4688],{},[924,4684,4687],{"href":4685,"rel":4686},"https:\u002F\u002Fgithub.com\u002Fxibosignage\u002Fxibo-dotnetclient",[928],"Xibo for Windows"," v4 R407 (C#\u002F.NET + CEF, 2026-03-30) — the only actively maintained upstream player",[935,4690,4691,4695],{},[924,4692,4694],{"href":2729,"rel":4693},[928],"Arexibo"," v0.3.2 (Rust + Qt, 2026-03-30) — PDF rendering, RPM\u002FDEB packaging, duration fixes",[4697,4698],"hr",{},[73,4700,4702],{"id":4701},"executive-summary","Executive Summary",[25,4704,4705,4718],{},[28,4706,4707],{},[31,4708,4709,4712,4715],{},[34,4710,4711],{},"Area",[34,4713,4714],{},"Parity",[34,4716,4717],{},"Notes",[41,4719,4720,4733,4749,4761,4773,4785,4797,4809,4821,4833,4856,4869],{},[31,4721,4722,4727,4730],{},[46,4723,4724],{},[938,4725,4726],{},"Schedule Management",[46,4728,4729],{},"100%",[46,4731,4732],{},"Full dayparting, interrupts, conflict detection, interleaved defaults, weather criteria",[31,4734,4735,4740,4742],{},[46,4736,4737],{},[938,4738,4739],{},"XMDS Communication",[46,4741,4729],{},[46,4743,4744,4745,4748],{},"SOAP + REST dual transport with auto-detection and ",[938,4746,4747],{},"idempotent cache-through"," — both transports converge on the same proxy mirror paths. XMDS signed URLs routed through cache-through proxy (no CORS). CRC32 + ETag caching. Display status codes fully reported",[31,4750,4751,4756,4758],{},[46,4752,4753],{},[938,4754,4755],{},"File Management",[46,4757,4729],{},[46,4759,4760],{},"Parallel 4-chunk downloads, download resume, Service Worker progressive streaming, transport-agnostic ContentStore",[31,4762,4763,4768,4770],{},[46,4764,4765],{},[938,4766,4767],{},"Renderer",[46,4769,4729],{},[46,4771,4772],{},"Canvas regions, audio overlay, image scale\u002Falign, exit transitions, drawers, sub-playlists, XIC handlers, shell commands, ticker duration via NUMITEMS\u002FDURATION parsing",[31,4774,4775,4780,4782],{},[46,4776,4777],{},[938,4778,4779],{},"XMR Push Messaging",[46,4781,4729],{},[46,4783,4784],{},"Native XmrClient with generic action dispatch — all 14 CMS actions. Zero deps, 97% smaller bundle. Exponential backoff reconnect",[31,4786,4787,4792,4794],{},[46,4788,4789],{},[938,4790,4791],{},"Stats\u002FLogging",[46,4793,4729],{},[46,4795,4796],{},"Proof-of-play + event stats + hour-boundary splitting + log batching. Stats delegation via SyncManager for multi-display setups",[31,4798,4799,4804,4806],{},[46,4800,4801],{},[938,4802,4803],{},"Config\u002FSettings",[46,4805,4729],{},[46,4807,4808],{},"Centralized state + DisplaySettings class + Wake Lock + offline fallback + persistent durations. Display status codes fully implemented",[31,4810,4811,4816,4818],{},[46,4812,4813],{},[938,4814,4815],{},"Interactive Control",[46,4817,4729],{},[46,4819,4820],{},"Full IC server + XIC event handlers + touch\u002Fkeyboard actions + playback control",[31,4822,4823,4828,4830],{},[46,4824,4825],{},[938,4826,4827],{},"Screenshot Capture",[46,4829,4729],{},[46,4831,4832],{},"Native getDisplayMedia + html2canvas fallback",[31,4834,4835,4840,4843],{},[46,4836,4837],{},[938,4838,4839],{},"Multi-display",[46,4841,4842],{},"100%+",[46,4844,4845,4846,382,4849,4852,4853],{},"BroadcastChannel (same-machine) + WebSocket relay (cross-device LAN). Mirror mode + wall mode. ",[938,4847,4848],{},"12 choreography effects",[938,4850,4851],{},"\u003C8ms sync precision",", token auth, syncGroupId isolation, offline LAN sync, stats delegation. Works on Electron + Chromium. ",[938,4854,4855],{},"Most capable sync implementation in any Xibo player.",[31,4857,4858,4863,4866],{},[46,4859,4860],{},[938,4861,4862],{},"Packaging",[46,4864,4865],{},"New",[46,4867,4868],{},"RPM\u002FDEB via GitHub Actions, Electron wrapper, Chromium kiosk",[31,4870,4871,4876,4878],{},[46,4872,4873],{},[938,4874,4875],{},"Kiosk Environment",[46,4877,4865],{},[46,4879,4880],{},"GNOME Kiosk session, health monitoring, first-boot wizard, bootable images",[16,4882,4883],{},[938,4884,4885],{},"Overall: 100% feature parity across all areas. Unique capabilities: REST transport, protocol auto-detect, persistent durations, canvas regions, download resume, multi-display sync (mirror + wall mode), playback control, complete kiosk OS",[4697,4887],{},[73,4889,4891],{"id":4890},"performance-comparison","Performance Comparison",[25,4893,4894,4913],{},[28,4895,4896],{},[31,4897,4898,4901,4904,4907,4910],{},[34,4899,4900],{},"Metric",[34,4902,4903],{},"XLR v1.0.24",[34,4905,4906],{},"Windows v4 R407",[34,4908,4909],{},"Arexibo v0.3.2",[34,4911,4912],{},"XiboPlayer v0.7.13",[41,4914,4915,4934,4953,4971,4990,5010,5029,5048,5066],{},[31,4916,4917,4920,4923,4926,4929],{},[46,4918,4919],{},"Initial load (cold)",[46,4921,4922],{},"17-20s",[46,4924,4925],{},"5-10s",[46,4927,4928],{},"12-15s",[46,4930,4931],{},[938,4932,4933],{},"3-5s",[31,4935,4936,4939,4942,4945,4948],{},[46,4937,4938],{},"Layout replay",[46,4940,4941],{},"2-3s",[46,4943,4944],{},"1-2s",[46,4946,4947],{},"\u003C1s",[46,4949,4950],{},[938,4951,4952],{},"\u003C0.5s",[31,4954,4955,4958,4961,4963,4965],{},[46,4956,4957],{},"1GB file download",[46,4959,4960],{},"~5 min",[46,4962,4960],{},[46,4964,4960],{},[46,4966,4967,4970],{},[938,4968,4969],{},"1-2 min"," (4 parallel chunks)",[31,4972,4973,4976,4979,4982,4984],{},[46,4974,4975],{},"Memory after 10 cycles",[46,4977,4978],{},"+500MB (growing)",[46,4980,4981],{},"Stable",[46,4983,4981],{},[46,4985,4986,4989],{},[938,4987,4988],{},"Stable (0% growth)"," (PSS-tracked, blob lifecycle + renderer recycling)",[31,4991,4992,4995,4998,5001,5004],{},[46,4993,4994],{},"Bundle size",[46,4996,4997],{},"~2MB (with video.js)",[46,4999,5000],{},"~50MB (CEF)",[46,5002,5003],{},"~10MB (Rust binary)",[46,5005,5006,5009],{},[938,5007,5008],{},"~500KB"," (minified)",[31,5011,5012,5015,5018,5021,5023],{},[46,5013,5014],{},"Widget switch time",[46,5016,5017],{},"~200ms (recreate)",[46,5019,5020],{},"~100ms",[46,5022,5020],{},[46,5024,5025,5028],{},[938,5026,5027],{},"\u003C50ms"," (visibility toggle)",[31,5030,5031,5034,5037,5040,5042],{},[46,5032,5033],{},"Multi-display sync precision",[46,5035,5036],{},"N\u002FA",[46,5038,5039],{},"N\u002FA (zero sync code)",[46,5041,5036],{},[46,5043,5044,5047],{},[938,5045,5046],{},"\u003C8ms"," (WebSocket relay)",[31,5049,5050,5053,5055,5058,5060],{},[46,5051,5052],{},"Choreography effects",[46,5054,5036],{},[46,5056,5057],{},"None (zero sync code)",[46,5059,5036],{},[46,5061,5062,5065],{},[938,5063,5064],{},"12 effects"," (diagonal, wave, center-out, etc.)",[31,5067,5068,5071,5076,5080,5085],{},[46,5069,5070],{},"Automated tests",[46,5072,5073],{},[938,5074,5075],{},"0",[46,5077,5078],{},[938,5079,5075],{},[46,5081,5082],{},[938,5083,5084],{},"2",[46,5086,5087,5090],{},[938,5088,5089],{},"1629"," (49 test files)",[4697,5092],{},[73,5094,5096],{"id":5095},"electron-vs-chromium-v0713-production-profiling","Electron vs Chromium (v0.7.13 production profiling)",[16,5098,5099],{},"Both players run the same PWA. Profiled in production kiosk fullscreen mode playing identical content on the same machine (Fedora 43, Wayland, Intel UHD 630 GPU).",[25,5101,5102,5114],{},[28,5103,5104],{},[31,5105,5106,5108,5111],{},[34,5107,4900],{},[34,5109,5110],{},"Electron 41 (Chrome 146)",[34,5112,5113],{},"Chromium 146",[41,5115,5116,5127,5138,5149,5160,5171,5182,5196,5207],{},[31,5117,5118,5121,5124],{},[46,5119,5120],{},"Total CPU",[46,5122,5123],{},"5-8%",[46,5125,5126],{},"4-7%",[31,5128,5129,5132,5135],{},[46,5130,5131],{},"Total PSS",[46,5133,5134],{},"330 MB (stable)",[46,5136,5137],{},"360 MB (stable)",[31,5139,5140,5143,5146],{},[46,5141,5142],{},"GPU PSS",[46,5144,5145],{},"270 MB (stable)",[46,5147,5148],{},"55 MB (stable)",[31,5150,5151,5154,5157],{},[46,5152,5153],{},"Renderer PSS",[46,5155,5156],{},"40 MB (stable)",[46,5158,5159],{},"280 MB (stable)",[31,5161,5162,5165,5168],{},[46,5163,5164],{},"GPU DRM render time",[46,5166,5167],{},"18s",[46,5169,5170],{},"52s",[31,5172,5173,5176,5179],{},[46,5174,5175],{},"Process count",[46,5177,5178],{},"8",[46,5180,5181],{},"12",[31,5183,5184,5187,5192],{},[46,5185,5186],{},"Memory growth",[46,5188,5189],{},[938,5190,5191],{},"0%",[46,5193,5194],{},[938,5195,5191],{},[31,5197,5198,5201,5204],{},[46,5199,5200],{},"Wayland GPU accel",[46,5202,5203],{},"Yes (GPU auto-detect)",[46,5205,5206],{},"Yes (GPU rasterization)",[31,5208,5209,5211,5214],{},[46,5210,3151],{},[46,5212,5213],{},"Yes (content store)",[46,5215,5213],{},[16,5217,5218],{},[938,5219,5220],{},"Key findings:",[932,5222,5223,5229,5235,5241],{},[935,5224,5225,5228],{},[938,5226,5227],{},"CPU parity"," — both players at 4-8% in production fullscreen mode with GPU-accelerated rasterization and compositing.",[935,5230,5231,5234],{},[938,5232,5233],{},"Continuous automated monitoring"," — CPU per process type (main, GPU, renderer, network), PSS memory, file descriptors, GPU DRM render time and iGPU utilization are tracked every 60 seconds. Zero memory growth confirmed over extended production runs.",[935,5236,5237,5240],{},[938,5238,5239],{},"GPU auto-detection"," — on hybrid GPU systems (Optimus), the player selects the display GPU automatically. Render-only GPUs are skipped when they can't share framebuffers on Wayland.",[935,5242,5243],{},"Both players survive CMS outages — cached layouts keep playing offline.",[4697,5245],{},[73,5247,5249],{"id":5248},"where-xiboplayer-is-better","Where XiboPlayer is Better",[1646,5251,5252,5258,5264,5270,5276,5282,5288,5294,5300,5306,5312,5318,5324,5330,5336,5363,5373,5379,5385,5391,5397,5407,5413,5424,5430],{},[935,5253,5254,5257],{},[938,5255,5256],{},"Dual transport (SOAP + REST) with idempotent cache"," — only player with native JSON\u002FREST communication and transport-agnostic caching (files cached via XMDS or REST are served identically)",[935,5259,5260,5263],{},[938,5261,5262],{},"ETag caching"," — HTTP 304 for unchanged responses",[935,5265,5266,5269],{},[938,5267,5268],{},"4x faster downloads"," — parallel 4-chunk downloads with dynamic sizing",[935,5271,5272,5275],{},[938,5273,5274],{},"Progressive streaming"," — Service Worker Range request support",[935,5277,5278,5281],{},[938,5279,5280],{},"Instant layout replay"," — element reuse (\u003C0.5s)",[935,5283,5284,5287],{},[938,5285,5286],{},"Better memory management"," — per-layout blob URL lifecycle tracking",[935,5289,5290,5293],{},[938,5291,5292],{},"PDF multi-page cycling"," — PDF.js with timed page transitions (XLR and Windows lack this)",[935,5295,5296,5299],{},[938,5297,5298],{},"Better dayparting"," — daily\u002Fweekly\u002Fmonthly recurrence with ISO day-of-week",[935,5301,5302,5305],{},[938,5303,5304],{},"Cross-platform"," — any device with a modern browser",[935,5307,5308,5311],{},[938,5309,5310],{},"Zero installation"," — PWA: just open a URL",[935,5313,5314,5317],{},[938,5315,5316],{},"Offline resilience"," — IndexedDB auto-fallback + queue barriers",[935,5319,5320,5323],{},[938,5321,5322],{},"RPM\u002FDEB packaging"," — native Linux packages with auto-update repos",[935,5325,5326,5329],{},[938,5327,5328],{},"Bootable images"," — ISO, raw, QCOW2 for x86_64 and aarch64",[935,5331,5332,5335],{},[938,5333,5334],{},"Player-agnostic kiosk"," — alternatives system for swapping players",[935,5337,5338,5341,5342,5345,5346,5345,5348,5350,5351,5354,5355,5358,5359],{},[938,5339,5340],{},"Multi-display sync with choreography"," — BroadcastChannel (same-machine) + WebSocket relay (LAN). Mirror mode or wall mode with ",[20,5343,5344],{},"layoutMap",". ",[938,5347,4851],{},[938,5349,4848],{}," for dramatic cascading transitions (diagonal, wave, center-out). Token-authenticated relay, syncGroupId isolation, offline LAN sync, stats delegation. Standalone ",[20,5352,5353],{},"xiboplayer-relay"," CLI. Works on both Electron and Chromium. ",[938,5356,5357],{},"Windows player has zero multi-display sync code"," (confirmed by source audit); XLR and Arexibo have none either. ",[924,5360,5362],{"href":5361},"\u002Ffeatures\u002Fmulti-display","Full guide",[935,5364,5365,5368,5369,5372],{},[938,5366,5367],{},"Playback control"," — keyboard shortcuts and timeline click-to-skip (disabled by default, enabled via ",[20,5370,5371],{},"controls"," config)",[935,5374,5375,5378],{},[938,5376,5377],{},"CMS Management API"," — 77-method REST client for full CMS v4 API",[935,5380,5381,5384],{},[938,5382,5383],{},"SSL cert relaxation"," — opt-in relaxSslCerts for media streams with self-signed certificates",[935,5386,5387,5390],{},[938,5388,5389],{},"Configurable log levels"," — config.json logLevel for runtime log control",[935,5392,5393,5396],{},[938,5394,5395],{},"Complete XMR implementation"," — native XmrClient with generic action dispatch handles all 14 CMS actions; upstream framework only dispatches 5 (the rest are silently dropped). Zero dependencies vs 68KB luxon",[935,5398,5399,5402,5403,5406],{},[938,5400,5401],{},"XMDS download caching"," — XMDS signed URLs rewritten to local proxy mirror paths, eliminating CORS failures and enabling ContentStore caching for all XMDS content (layouts, media, fonts, bundles). ",[20,5404,5405],{},"X-Cms-Download-Url"," header enables XMDS-only CMSes to use the full cache-through pipeline",[935,5408,5409,5412],{},[938,5410,5411],{},"1629 automated tests"," — 49 test files covering all SDK packages. Windows player has zero tests, XLR has zero tests, Arexibo has only 2 tests. XiboPlayer is the only Xibo player with a meaningful test suite",[935,5414,5415,5418,5419],{},[938,5416,5417],{},"Wayland hardware GPU acceleration"," — GPU auto-detection selects the display GPU on hybrid systems. GPU rasterization flags reduce Chromium CPU from 91% to 5%. Filed upstream as ",[924,5420,5423],{"href":5421,"rel":5422},"https:\u002F\u002Fgithub.com\u002Felectron\u002Felectron\u002Fissues\u002F50455",[928],"electron#50455",[935,5425,5426,5429],{},[938,5427,5428],{},"Offline-first playback"," — Content store serves cached layouts and media during CMS outages. Download manager race conditions fixed (commit-before-response, key format unification)",[935,5431,5432,5435],{},[938,5433,5434],{},"PSS-based memory monitoring"," — Proportional Set Size tracking distinguishes real memory cost from shared page inflation. Per-process type detection (gpu\u002Frenderer\u002Fbrowser\u002Fserver) with 48h overnight profiling",[4697,5437],{},[73,5439,5441],{"id":5440},"upstream-audit-results-2026-03-18","Upstream Audit Results (2026-03-18)",[16,5443,5444],{},"Code analysis of upstream repositories confirmed:",[932,5446,5447,5457,5462,5468,5473],{},[935,5448,5449,5452,5453,5456],{},[938,5450,5451],{},"Windows player",": zero multi-display sync code in the entire codebase. No sync manager, no relay, no choreography. The ",[20,5454,5455],{},"~50-100ms"," figure previously cited was theoretical — there is no implementation at all",[935,5458,5459,5461],{},[938,5460,5451],{},": zero automated tests. No test project, no test runner, no CI test step",[935,5463,5464,5467],{},[938,5465,5466],{},"XLR (xibo-layout-renderer)",": zero automated tests. The npm package ships with no test suite",[935,5469,5470,5472],{},[938,5471,4694],{},": 2 automated tests only (basic XMDS parsing)",[935,5474,5475,5478],{},[938,5476,5477],{},"XiboPlayer",": 1625 tests across 49 test files, covering core, renderer, cache, schedule, xmds, xmr, stats, settings, sync, and crypto packages",[4697,5480],{},{"title":675,"searchDepth":718,"depth":718,"links":5482},[5483,5484,5485,5486,5487],{"id":4701,"depth":689,"text":4702},{"id":4890,"depth":689,"text":4891},{"id":5095,"depth":689,"text":5096},{"id":5248,"depth":689,"text":5249},{"id":5440,"depth":689,"text":5441},"Detailed feature comparison: XiboPlayer v0.7.13 vs upstream Xibo players.",{},"\u002Fdocs\u002Fsdk\u002Fcomparison",{"title":4643,"description":5488},"docs\u002Fsdk\u002Fcomparison","DMepIe8V_rTNeVydAVJUnntO_MthmyYx52tWjinPWmE",{"id":5495,"title":5496,"author":7,"body":5497,"date":7,"description":6040,"extension":893,"meta":6041,"navigation":895,"path":6042,"robots":7,"seo":6043,"stem":6044,"tags":7,"__hash__":6045},"content_en\u002Fdocs\u002Fsdk\u002Fmulti-display.md","Multi-Display Video Walls",{"type":9,"value":5498,"toc":6027},[5499,5502,5505,5507,5516,5522,5525,5529,5533,5538,5542,5558,5562,5583,5587,5592,5599,5737,5743,5804,5808,5811,5826,5832,5835,5925,5929,5971,5978,5980,6024],[12,5500,5496],{"id":5501},"multi-display-video-walls",[16,5503,5504],{},"XiboPlayer supports synchronized multi-display playback. Multiple screens switch layouts simultaneously with \u003C8ms precision — coordinated over LAN with automatic discovery.",[73,5506,2630],{"id":2629},[16,5508,5509,5510,5512,5513,702],{},"One display is the ",[938,5511,450],{},", the rest are ",[938,5514,5515],{},"followers",[670,5517,5520],{"className":5518,"code":5519,"language":1307},[1305],"Lead Player (Screen 1)\n  └── Proxy Server + WebSocket Sync Relay\n        ├── Follower 1 (Screen 2) via WebSocket\n        ├── Follower 2 (Screen 3) via WebSocket\n        └── Follower 3 (Screen 4) via WebSocket\n",[20,5521,5519],{"__ignoreMap":675},[16,5523,5524],{},"The lead's proxy server includes a built-in WebSocket relay. Followers connect over LAN — no additional infrastructure needed.",[73,5526,5528],{"id":5527},"setup-4-display-video-wall","Setup: 4-display video wall",[916,5530,5532],{"id":5531},"_1-install-and-register-each-display","1. Install and register each display",[16,5534,5535,5536,1716],{},"Install the player on each machine and connect to the CMS. See ",[924,5537,1444],{"href":1842},[916,5539,5541],{"id":5540},"_2-create-a-sync-group-in-cms","2. Create a Sync Group in CMS",[1646,5543,5544,5549,5555],{},[935,5545,2370,5546],{},[938,5547,5548],{},"Displays → Sync Groups → Add Sync Group",[935,5550,5551,5552],{},"Set one display as ",[938,5553,5554],{},"Lead",[935,5556,5557],{},"Add all 4 displays as members",[916,5559,5561],{"id":5560},"_3-schedule-synchronized-content","3. Schedule synchronized content",[1646,5563,5564,5569,5580],{},[935,5565,5566],{},[938,5567,5568],{},"Schedule → Add Event",[935,5570,5571,5572,5575,5576,5579],{},"Set ",[938,5573,5574],{},"Event Type"," to ",[938,5577,5578],{},"Synchronised Event"," (not a regular event)",[935,5581,5582],{},"Assign to the display group matching your sync group",[916,5584,5586],{"id":5585},"_4-configure-choreography-optional","4. Configure choreography (optional)",[16,5588,5589,5590,702],{},"Set grid positions in each display's ",[20,5591,22],{},[16,5593,5594,4353,5596,5598],{},[938,5595,5554],{},[20,5597,53],{},"):",[670,5600,5602],{"className":672,"code":5601,"language":674,"meta":675,"style":675},"{\n  \"sync\": {\n    \"topology\": { \"x\": 0, \"y\": 0 },\n    \"choreography\": \"diagonal-tl\",\n    \"staggerMs\": 200,\n    \"gridCols\": 2,\n    \"gridRows\": 2\n  }\n}\n",[20,5603,5604,5608,5620,5663,5683,5699,5715,5729,5733],{"__ignoreMap":675},[679,5605,5606],{"class":681,"line":682},[679,5607,686],{"class":685},[679,5609,5610,5612,5614,5616,5618],{"class":681,"line":689},[679,5611,693],{"class":692},[679,5613,818],{"class":696},[679,5615,699],{"class":692},[679,5617,702],{"class":685},[679,5619,825],{"class":685},[679,5621,5622,5624,5627,5629,5631,5634,5636,5639,5641,5643,5646,5649,5651,5654,5656,5658,5660],{"class":681,"line":718},[679,5623,831],{"class":692},[679,5625,5626],{"class":834},"topology",[679,5628,699],{"class":692},[679,5630,702],{"class":685},[679,5632,5633],{"class":685}," {",[679,5635,706],{"class":692},[679,5637,5638],{"class":769},"x",[679,5640,699],{"class":692},[679,5642,702],{"class":685},[679,5644,5645],{"class":769}," 0",[679,5647,5648],{"class":685},",",[679,5650,706],{"class":692},[679,5652,5653],{"class":769},"y",[679,5655,699],{"class":692},[679,5657,702],{"class":685},[679,5659,5645],{"class":769},[679,5661,5662],{"class":685}," },\n",[679,5664,5665,5667,5670,5672,5674,5676,5679,5681],{"class":681,"line":738},[679,5666,831],{"class":692},[679,5668,5669],{"class":834},"choreography",[679,5671,699],{"class":692},[679,5673,702],{"class":685},[679,5675,706],{"class":705},[679,5677,5678],{"class":709},"diagonal-tl",[679,5680,699],{"class":705},[679,5682,715],{"class":685},[679,5684,5685,5687,5690,5692,5694,5697],{"class":681,"line":758},[679,5686,831],{"class":692},[679,5688,5689],{"class":834},"staggerMs",[679,5691,699],{"class":692},[679,5693,702],{"class":685},[679,5695,5696],{"class":769}," 200",[679,5698,715],{"class":685},[679,5700,5701,5703,5706,5708,5710,5713],{"class":681,"line":775},[679,5702,831],{"class":692},[679,5704,5705],{"class":834},"gridCols",[679,5707,699],{"class":692},[679,5709,702],{"class":685},[679,5711,5712],{"class":769}," 2",[679,5714,715],{"class":685},[679,5716,5717,5719,5722,5724,5726],{"class":681,"line":794},[679,5718,831],{"class":692},[679,5720,5721],{"class":834},"gridRows",[679,5723,699],{"class":692},[679,5725,702],{"class":685},[679,5727,5728],{"class":769}," 2\n",[679,5730,5731],{"class":681,"line":813},[679,5732,869],{"class":685},[679,5734,5735],{"class":681,"line":828},[679,5736,875],{"class":685},[16,5738,5739,5742],{},[938,5740,5741],{},"Followers"," only need their grid position:",[670,5744,5746],{"className":672,"code":5745,"language":674,"meta":675,"style":675},"{ \"sync\": { \"topology\": { \"x\": 1, \"y\": 0 } } }\n",[20,5747,5748],{"__ignoreMap":675},[679,5749,5750,5753,5755,5757,5759,5761,5763,5765,5767,5769,5771,5773,5775,5777,5779,5781,5784,5786,5788,5790,5792,5794,5796,5799,5801],{"class":681,"line":682},[679,5751,5752],{"class":685},"{",[679,5754,706],{"class":692},[679,5756,818],{"class":696},[679,5758,699],{"class":692},[679,5760,702],{"class":685},[679,5762,5633],{"class":685},[679,5764,706],{"class":692},[679,5766,5626],{"class":834},[679,5768,699],{"class":692},[679,5770,702],{"class":685},[679,5772,5633],{"class":685},[679,5774,706],{"class":692},[679,5776,5638],{"class":769},[679,5778,699],{"class":692},[679,5780,702],{"class":685},[679,5782,5783],{"class":769}," 1",[679,5785,5648],{"class":685},[679,5787,706],{"class":692},[679,5789,5653],{"class":769},[679,5791,699],{"class":692},[679,5793,702],{"class":685},[679,5795,5645],{"class":769},[679,5797,5798],{"class":685}," }",[679,5800,5798],{"class":685},[679,5802,5803],{"class":685}," }\n",[73,5805,5807],{"id":5806},"auto-discovery-mdns","Auto-discovery (mDNS)",[16,5809,5810],{},"Followers discover the lead automatically via mDNS — no manual IP configuration:",[1646,5812,5813,5820,5823],{},[935,5814,5815,5816,5819],{},"Lead publishes ",[20,5817,5818],{},"_xibo-sync._tcp"," via mDNS with the sync group ID",[935,5821,5822],{},"Followers browse for this service on each collection cycle",[935,5824,5825],{},"If mDNS times out (10s), falls back to CMS-provided IP",[16,5827,5828,5831],{},[938,5829,5830],{},"Requirement",": all players on the same subnet (UDP 5353).",[73,5833,5052],{"id":5834},"choreography-effects",[25,5836,5837,5846],{},[28,5838,5839],{},[31,5840,5841,5844],{},[34,5842,5843],{},"Effect",[34,5845,91],{},[41,5847,5848,5858,5871,5884,5902,5915],{},[31,5849,5850,5855],{},[46,5851,5852],{},[20,5853,5854],{},"simultaneous",[46,5856,5857],{},"All displays switch at once",[31,5859,5860,5868],{},[46,5861,5862,3498,5865],{},[20,5863,5864],{},"wave-right",[20,5866,5867],{},"wave-left",[46,5869,5870],{},"Horizontal sweep",[31,5872,5873,5881],{},[46,5874,5875,3498,5878],{},[20,5876,5877],{},"wave-down",[20,5879,5880],{},"wave-up",[46,5882,5883],{},"Vertical sweep",[31,5885,5886,5899],{},[46,5887,5888,3498,5890,3498,5893,3498,5896],{},[20,5889,5678],{},[20,5891,5892],{},"diagonal-tr",[20,5894,5895],{},"diagonal-bl",[20,5897,5898],{},"diagonal-br",[46,5900,5901],{},"Corner cascade",[31,5903,5904,5912],{},[46,5905,5906,3498,5909],{},[20,5907,5908],{},"center-out",[20,5910,5911],{},"outside-in",[46,5913,5914],{},"Center or edge first",[31,5916,5917,5922],{},[46,5918,5919],{},[20,5920,5921],{},"random",[46,5923,5924],{},"Random delay per display",[73,5926,5928],{"id":5927},"transport-layers","Transport layers",[25,5930,5931,5943],{},[28,5932,5933],{},[31,5934,5935,5938,5941],{},[34,5936,5937],{},"Transport",[34,5939,5940],{},"Scope",[34,5942,3554],{},[41,5944,5945,5958],{},[31,5946,5947,5952,5955],{},[46,5948,5949],{},[938,5950,5951],{},"BroadcastChannel",[46,5953,5954],{},"Same machine",[46,5956,5957],{},"Multiple tabs\u002Fwindows on one device",[31,5959,5960,5965,5968],{},[46,5961,5962],{},[938,5963,5964],{},"WebSocket relay",[46,5966,5967],{},"Cross-device LAN",[46,5969,5970],{},"Separate devices on the network",[16,5972,5973,5974,5977],{},"Selected automatically. BroadcastChannel for same-machine, WebSocket when ",[20,5975,5976],{},"relayUrl"," is set.",[73,5979,1767],{"id":1766},[932,5981,5982,5988,5998,6007],{},[935,5983,5984,5987],{},[938,5985,5986],{},"Can't connect to relay",": Check firewall allows port 8765\u002F8766 between players",[935,5989,5990,5993,5994,5997],{},[938,5991,5992],{},"mDNS not working",": Verify same subnet, check ",[20,5995,5996],{},"udp\u002F5353"," not blocked",[935,5999,6000,6003,6004,6006],{},[938,6001,6002],{},"Layouts not syncing",": Must use ",[938,6005,5578],{}," type in CMS schedule",[935,6008,6009,6012,6013,382,6015,382,6017,382,6019,382,6021,6023],{},[938,6010,6011],{},"No choreography",": Set ",[20,6014,5626],{},[20,6016,5669],{},[20,6018,5689],{},[20,6020,5705],{},[20,6022,5721],{}," in lead config",[877,6025,6026],{},"html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sseR_, html code.shiki .sseR_{--shiki-light:#9C3EDA;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZMiF, html code.shiki .sZMiF{--shiki-light:#E2931D;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":675,"searchDepth":718,"depth":718,"links":6028},[6029,6030,6036,6037,6038,6039],{"id":2629,"depth":689,"text":2630},{"id":5527,"depth":689,"text":5528,"children":6031},[6032,6033,6034,6035],{"id":5531,"depth":718,"text":5532},{"id":5540,"depth":718,"text":5541},{"id":5560,"depth":718,"text":5561},{"id":5585,"depth":718,"text":5586},{"id":5806,"depth":689,"text":5807},{"id":5834,"depth":689,"text":5052},{"id":5927,"depth":689,"text":5928},{"id":1766,"depth":689,"text":1767},"Set up synchronized video walls with automatic discovery and choreography effects",{"order":718},"\u002Fdocs\u002Fsdk\u002Fmulti-display",{"title":5496,"description":6040},"docs\u002Fsdk\u002Fmulti-display","yda7D7RzhcJjxsLj3hAhTodT8ZB22WrectF9cxzyf9k",{"id":6047,"title":6048,"author":7,"body":6049,"date":7,"description":6609,"extension":893,"meta":6610,"navigation":895,"path":6611,"robots":7,"seo":6612,"stem":6613,"tags":7,"__hash__":6614},"content_en\u002Fdocs\u002Fsdk\u002Fpackages.md","Package Reference",{"type":9,"value":6050,"toc":6602},[6051,6054,6065,6157,6161,6437,6441,6446,6458,6461,6467,6473,6477,6482,6496,6499,6504,6584,6586,6599],[12,6052,6048],{"id":6053},"package-reference",[16,6055,6056,6057,6064],{},"All packages are published under the ",[924,6058,6061],{"href":6059,"rel":6060},"https:\u002F\u002Fwww.npmjs.com\u002Forg\u002Fxiboplayer",[928],[20,6062,6063],{},"@xiboplayer"," scope on npm.",[670,6066,6068],{"className":960,"code":6067,"language":962,"meta":675,"style":675},"# Install everything\nnpm install @xiboplayer\u002Fcore @xiboplayer\u002Frenderer @xiboplayer\u002Fschedule \\\n  @xiboplayer\u002Fxmds @xiboplayer\u002Fxmr @xiboplayer\u002Fcache @xiboplayer\u002Fstats \\\n  @xiboplayer\u002Fsettings @xiboplayer\u002Futils @xiboplayer\u002Fsync @xiboplayer\u002Fproxy\n\n# Or individual packages\nnpm install @xiboplayer\u002Fxmds    # just the CMS client\nnpm install @xiboplayer\u002Fcache   # just the offline cache\n",[20,6069,6070,6075,6095,6111,6125,6129,6134,6146],{"__ignoreMap":675},[679,6071,6072],{"class":681,"line":682},[679,6073,6074],{"class":969},"# Install everything\n",[679,6076,6077,6080,6082,6085,6088,6091],{"class":681,"line":689},[679,6078,6079],{"class":975},"npm",[679,6081,1067],{"class":709},[679,6083,6084],{"class":709}," @xiboplayer\u002Fcore",[679,6086,6087],{"class":709}," @xiboplayer\u002Frenderer",[679,6089,6090],{"class":709}," @xiboplayer\u002Fschedule",[679,6092,6094],{"class":6093},"s_hVV"," \\\n",[679,6096,6097,6100,6103,6106,6109],{"class":681,"line":718},[679,6098,6099],{"class":709},"  @xiboplayer\u002Fxmds",[679,6101,6102],{"class":709}," @xiboplayer\u002Fxmr",[679,6104,6105],{"class":709}," @xiboplayer\u002Fcache",[679,6107,6108],{"class":709}," @xiboplayer\u002Fstats",[679,6110,6094],{"class":6093},[679,6112,6113,6116,6119,6122],{"class":681,"line":738},[679,6114,6115],{"class":709},"  @xiboplayer\u002Fsettings",[679,6117,6118],{"class":709}," @xiboplayer\u002Futils",[679,6120,6121],{"class":709}," @xiboplayer\u002Fsync",[679,6123,6124],{"class":709}," @xiboplayer\u002Fproxy\n",[679,6126,6127],{"class":681,"line":758},[679,6128,1075],{"emptyLinePlaceholder":895},[679,6130,6131],{"class":681,"line":775},[679,6132,6133],{"class":969},"# Or individual packages\n",[679,6135,6136,6138,6140,6143],{"class":681,"line":794},[679,6137,6079],{"class":975},[679,6139,1067],{"class":709},[679,6141,6142],{"class":709}," @xiboplayer\u002Fxmds",[679,6144,6145],{"class":969},"    # just the CMS client\n",[679,6147,6148,6150,6152,6154],{"class":681,"line":813},[679,6149,6079],{"class":975},[679,6151,1067],{"class":709},[679,6153,6105],{"class":709},[679,6155,6156],{"class":969},"   # just the offline cache\n",[73,6158,6160],{"id":6159},"overview","Overview",[25,6162,6163,6175],{},[28,6164,6165],{},[31,6166,6167,6170,6172],{},[34,6168,6169],{},"Package",[34,6171,91],{},[34,6173,6174],{},"Key Exports",[41,6176,6177,6193,6213,6233,6252,6269,6288,6308,6325,6342,6365,6382,6402,6421],{},[31,6178,6179,6185,6188],{},[46,6180,6181],{},[924,6182,4427],{"href":6183,"rel":6184},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@xiboplayer\u002Fcore",[928],[46,6186,6187],{},"Player orchestration, collection cycle, offline mode",[46,6189,6190],{},[20,6191,6192],{},"PlayerCore",[31,6194,6195,6202,6205],{},[46,6196,6197],{},[924,6198,6201],{"href":6199,"rel":6200},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@xiboplayer\u002Frenderer",[928],"@xiboplayer\u002Frenderer",[46,6203,6204],{},"XLF layout rendering, transitions, actions",[46,6206,6207,382,6210],{},[20,6208,6209],{},"RendererLite",[20,6211,6212],{},"LayoutPool",[31,6214,6215,6222,6225],{},[46,6216,6217],{},[924,6218,6221],{"href":6219,"rel":6220},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@xiboplayer\u002Fschedule",[928],"@xiboplayer\u002Fschedule",[46,6223,6224],{},"Campaigns, dayparting, interrupts, overlays",[46,6226,6227,382,6230],{},[20,6228,6229],{},"ScheduleManager",[20,6231,6232],{},"InterruptScheduler",[31,6234,6235,6241,6244],{},[46,6236,6237],{},[924,6238,4441],{"href":6239,"rel":6240},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@xiboplayer\u002Fxmds",[928],[46,6242,6243],{},"CMS client (SOAP + REST dual transport)",[46,6245,6246,382,6249],{},[20,6247,6248],{},"XmdsClient",[20,6250,6251],{},"RestClient",[31,6253,6254,6261,6264],{},[46,6255,6256],{},[924,6257,6260],{"href":6258,"rel":6259},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@xiboplayer\u002Fxmr",[928],"@xiboplayer\u002Fxmr",[46,6262,6263],{},"Real-time push commands via WebSocket",[46,6265,6266],{},[20,6267,6268],{},"XmrWrapper",[31,6270,6271,6277,6280],{},[46,6272,6273],{},[924,6274,4455],{"href":6275,"rel":6276},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@xiboplayer\u002Fcache",[928],[46,6278,6279],{},"Parallel chunk downloads, MD5 verification",[46,6281,6282,382,6285],{},[20,6283,6284],{},"StoreClient",[20,6286,6287],{},"DownloadManager",[31,6289,6290,6297,6300],{},[46,6291,6292],{},[924,6293,6296],{"href":6294,"rel":6295},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@xiboplayer\u002Fstats",[928],"@xiboplayer\u002Fstats",[46,6298,6299],{},"Proof-of-play tracking, log reporting",[46,6301,6302,382,6305],{},[20,6303,6304],{},"StatsCollector",[20,6306,6307],{},"LogReporter",[31,6309,6310,6317,6320],{},[46,6311,6312],{},[924,6313,6316],{"href":6314,"rel":6315},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@xiboplayer\u002Fsettings",[928],"@xiboplayer\u002Fsettings",[46,6318,6319],{},"CMS display settings with reactive updates",[46,6321,6322],{},[20,6323,6324],{},"DisplaySettings",[31,6326,6327,6334,6337],{},[46,6328,6329],{},[924,6330,6333],{"href":6331,"rel":6332},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@xiboplayer\u002Fcrypto",[928],"@xiboplayer\u002Fcrypto",[46,6335,6336],{},"RSA key generation for XMR registration",[46,6338,6339],{},[20,6340,6341],{},"generateKeyPair",[31,6343,6344,6351,6354],{},[46,6345,6346],{},[924,6347,6350],{"href":6348,"rel":6349},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@xiboplayer\u002Futils",[928],"@xiboplayer\u002Futils",[46,6352,6353],{},"Logger, EventEmitter, config, fetchWithRetry",[46,6355,6356,382,6359,382,6362],{},[20,6357,6358],{},"EventEmitter",[20,6360,6361],{},"Config",[20,6363,6364],{},"CmsApi",[31,6366,6367,6374,6377],{},[46,6368,6369],{},[924,6370,6373],{"href":6371,"rel":6372},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@xiboplayer\u002Fsw",[928],"@xiboplayer\u002Fsw",[46,6375,6376],{},"Service Worker for media caching",[46,6378,6379],{},[20,6380,6381],{},"SwMediaHandler",[31,6383,6384,6391,6394],{},[46,6385,6386],{},[924,6387,6390],{"href":6388,"rel":6389},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@xiboplayer\u002Fsync",[928],"@xiboplayer\u002Fsync",[46,6392,6393],{},"Multi-display video wall synchronization",[46,6395,6396,382,6399],{},[20,6397,6398],{},"SyncManager",[20,6400,6401],{},"computeChoreography",[31,6403,6404,6410,6413],{},[46,6405,6406],{},[924,6407,1270],{"href":6408,"rel":6409},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@xiboplayer\u002Fproxy",[928],[46,6411,6412],{},"CORS proxy, PWA server, sync relay",[46,6414,6415,382,6418],{},[20,6416,6417],{},"createProxyApp",[20,6419,6420],{},"startServer",[31,6422,6423,6429,6432],{},[46,6424,6425],{},[924,6426,6428],{"href":4361,"rel":6427},[928],"@xiboplayer\u002Fpwa",[46,6430,6431],{},"Complete browser-based player",[46,6433,6434],{},[20,6435,6436],{},"PwaPlayer",[73,6438,6440],{"id":6439},"cms-communication","CMS communication",[16,6442,6443,6445],{},[20,6444,4441],{}," provides two transports with identical API surfaces:",[932,6447,6448,6453],{},[935,6449,6450,6452],{},[938,6451,6248],{}," (SOAP\u002FXML) — compatible with all CMS versions (v3-v7)",[935,6454,6455,6457],{},[938,6456,6251],{}," (REST\u002FJSON) — 30% smaller payloads, ETag 304 caching",[16,6459,6460],{},"Protocol auto-detection selects the best transport at startup. Both converge on the same ContentStore mirror paths.",[16,6462,6463,6466],{},[938,6464,6465],{},"XMDS methods",": RegisterDisplay, RequiredFiles, Schedule, GetResource, NotifyStatus, MediaInventory, BlackList, SubmitStats, SubmitScreenShot, SubmitLog",[16,6468,6469,6472],{},[938,6470,6471],{},"XMR commands",": collectNow, screenshot, changeLayout, overlayLayout, revertToSchedule, purgeAll, dataUpdate, triggerWebhook, commandAction, criteriaUpdate",[73,6474,6476],{"id":6475},"downloads-and-caching","Downloads and caching",[16,6478,6479,6481],{},[20,6480,4455],{}," splits large files into 4 parallel 50MB chunks for fast downloads. Features:",[932,6483,6484,6487,6490,6493],{},[935,6485,6486],{},"MD5 verification per chunk",[935,6488,6489],{},"Download resume from last successful chunk",[935,6491,6492],{},"CMS-configured download time windows",[935,6494,6495],{},"Font CSS URL rewriting to local cache paths",[73,6497,2670],{"id":6498},"rendering",[16,6500,6501,6503],{},[20,6502,6201],{}," parses XLF (Xibo Layout Format) and renders to DOM:",[25,6505,6506,6516],{},[28,6507,6508],{},[31,6509,6510,6513],{},[34,6511,6512],{},"Widget type",[34,6514,6515],{},"Implementation",[41,6517,6518,6529,6540,6551,6559,6567,6577],{},[31,6519,6520,6523],{},[46,6521,6522],{},"Video",[46,6524,6525,6528],{},[20,6526,6527],{},"\u003Cvideo>"," with HLS.js fallback",[31,6530,6531,6534],{},[46,6532,6533],{},"Image",[46,6535,6536,6539],{},[20,6537,6538],{},"\u003Cimg>"," with scaleType, align\u002Fvalign",[31,6541,6542,6545],{},[46,6543,6544],{},"Audio",[46,6546,6547,6550],{},[20,6548,6549],{},"\u003Caudio>"," with visualization overlay",[31,6552,6553,6556],{},[46,6554,6555],{},"PDF",[46,6557,6558],{},"PDF.js canvas (lazy-loaded)",[31,6560,6561,6564],{},[46,6562,6563],{},"Text\u002FTicker",[46,6565,6566],{},"iframe via GetResource",[31,6568,6569,6572],{},[46,6570,6571],{},"Web page",[46,6573,6574],{},[20,6575,6576],{},"\u003Ciframe src=\"...\">",[31,6578,6579,6582],{},[46,6580,6581],{},"All CMS widgets",[46,6583,6566],{},[73,6585,2722],{"id":2721},[932,6587,6588,6593,6596],{},[935,6589,6590],{},[924,6591,4352],{"href":4350,"rel":6592},[928],[935,6594,6595],{},"1744 tests across 54 suites",[935,6597,6598],{},"License: AGPL-3.0-or-later",[877,6600,6601],{},"html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":675,"searchDepth":718,"depth":718,"links":6603},[6604,6605,6606,6607,6608],{"id":6159,"depth":689,"text":6160},{"id":6439,"depth":689,"text":6440},{"id":6475,"depth":689,"text":6476},{"id":6498,"depth":689,"text":2670},{"id":2721,"depth":689,"text":2722},"All @xiboplayer\u002F* npm packages with purpose, key exports, and dependencies",{"order":689},"\u002Fdocs\u002Fsdk\u002Fpackages",{"title":6048,"description":6609},"docs\u002Fsdk\u002Fpackages","CyG0Ois4akIbdMmZDTXwBtjt3sb8IR1jL8Paw3WGu78",{"id":6616,"title":6617,"author":7,"body":6618,"date":7,"description":7659,"extension":893,"meta":7660,"navigation":895,"path":7661,"robots":7,"seo":7662,"stem":7663,"tags":7,"__hash__":7664},"content_en\u002Fdocs\u002Fsdk\u002Ftechnical-manual.md","Technical Manual",{"type":9,"value":6619,"toc":7636},[6620,6623,6626,6630,6670,6674,6678,6681,6687,6740,6745,6756,6760,6763,6876,6879,6883,6887,6890,7209,7213,7306,7310,7349,7353,7357,7360,7366,7392,7396,7445,7449,7453,7459,7462,7466,7480,7484,7487,7491,7497,7502,7526,7528,7630,7633],[12,6621,6617],{"id":6622},"technical-manual",[16,6624,6625],{},"Complete technical reference for developers and system integrators working with the xiboplayer ecosystem.",[73,6627,6629],{"id":6628},"sdk-internals","SDK internals",[25,6631,6632,6641],{},[28,6633,6634],{},[31,6635,6636,6639],{},[34,6637,6638],{},"Topic",[34,6640,91],{},[41,6642,6643,6652,6661],{},[31,6644,6645,6649],{},[46,6646,6647],{},[924,6648,2630],{"href":4637},[46,6650,6651],{},"Package dependency graph, data flow, event bus, platform abstraction",[31,6653,6654,6658],{},[46,6655,6656],{},[924,6657,6048],{"href":6611},[46,6659,6660],{},"All 14 @xiboplayer\u002F* packages with exports and dependencies",[31,6662,6663,6667],{},[46,6664,6665],{},[924,6666,4643],{"href":5490},[46,6668,6669],{},"Detailed comparison vs upstream Xibo players (Windows, XLR, arexibo)",[73,6671,6673],{"id":6672},"communication-protocols","Communication protocols",[916,6675,6677],{"id":6676},"xmds-cms-player","XMDS (CMS ↔ Player)",[16,6679,6680],{},"The player communicates with the CMS via XMDS — available in both SOAP and REST transports:",[16,6682,6683,6686],{},[938,6684,6685],{},"Collection cycle"," (every 5-900 seconds):",[1646,6688,6689,6695,6701,6707,6710,6716,6722,6728,6734],{},[935,6690,6691,6694],{},[20,6692,6693],{},"RegisterDisplay()"," — register\u002Fre-register, receive settings and XMR address",[935,6696,6697,6700],{},[20,6698,6699],{},"RequiredFiles()"," — get file manifest with MD5 hashes (CRC32 skip optimization)",[935,6702,6703,6706],{},[20,6704,6705],{},"Schedule()"," — get layout schedule XML",[935,6708,6709],{},"Download missing files — 4 parallel chunks, MD5 verification",[935,6711,6712,6715],{},[20,6713,6714],{},"MediaInventory()"," — report cached file inventory",[935,6717,6718,6721],{},[20,6719,6720],{},"NotifyStatus()"," — report device status (disk, timezone, layout)",[935,6723,6724,6727],{},[20,6725,6726],{},"SubmitStats()"," — proof-of-play records",[935,6729,6730,6733],{},[20,6731,6732],{},"SubmitLog()"," — queued log entries (batched, max 50)",[935,6735,6736,6739],{},[20,6737,6738],{},"SubmitScreenShot()"," — captured screenshot (if configured)",[16,6741,6742,702],{},[938,6743,6744],{},"REST vs SOAP",[932,6746,6747,6750,6753],{},[935,6748,6749],{},"REST: JSON payloads (~30% smaller), ETag 304 caching, JWT auth",[935,6751,6752],{},"SOAP: XML, compatible with all CMS versions (v3-v7)",[935,6754,6755],{},"Auto-detected at startup via protocol probe",[916,6757,6759],{"id":6758},"xmr-cms-player-push","XMR (CMS → Player push)",[16,6761,6762],{},"Real-time WebSocket commands from CMS to player:",[25,6764,6765,6774],{},[28,6766,6767],{},[31,6768,6769,6772],{},[34,6770,6771],{},"Command",[34,6773,572],{},[41,6775,6776,6786,6796,6806,6816,6826,6836,6846,6856,6866],{},[31,6777,6778,6783],{},[46,6779,6780],{},[20,6781,6782],{},"collectNow",[46,6784,6785],{},"Trigger immediate collection cycle",[31,6787,6788,6793],{},[46,6789,6790],{},[20,6791,6792],{},"screenshot",[46,6794,6795],{},"Capture and submit screenshot",[31,6797,6798,6803],{},[46,6799,6800],{},[20,6801,6802],{},"changeLayout",[46,6804,6805],{},"Switch to a specific layout",[31,6807,6808,6813],{},[46,6809,6810],{},[20,6811,6812],{},"overlayLayout",[46,6814,6815],{},"Show a layout as overlay",[31,6817,6818,6823],{},[46,6819,6820],{},[20,6821,6822],{},"revertToSchedule",[46,6824,6825],{},"Return to scheduled layout",[31,6827,6828,6833],{},[46,6829,6830],{},[20,6831,6832],{},"purgeAll",[46,6834,6835],{},"Clear cache and re-download",[31,6837,6838,6843],{},[46,6839,6840],{},[20,6841,6842],{},"dataUpdate",[46,6844,6845],{},"Refresh dataset\u002Fconnector data",[31,6847,6848,6853],{},[46,6849,6850],{},[20,6851,6852],{},"commandAction",[46,6854,6855],{},"Execute a CMS-defined command",[31,6857,6858,6863],{},[46,6859,6860],{},[20,6861,6862],{},"triggerWebhook",[46,6864,6865],{},"Trigger interactive action",[31,6867,6868,6873],{},[46,6869,6870],{},[20,6871,6872],{},"criteriaUpdate",[46,6874,6875],{},"Update display criteria",[16,6877,6878],{},"XMR uses RSA key exchange + ARC4 symmetric encryption. Auto-reconnect with exponential backoff (10 attempts).",[73,6880,6882],{"id":6881},"rendering-pipeline","Rendering pipeline",[916,6884,6886],{"id":6885},"xlf-xibo-layout-format","XLF (Xibo Layout Format)",[16,6888,6889],{},"Layouts are XML files defining regions, widgets, and transitions:",[670,6891,6895],{"className":6892,"code":6893,"language":6894,"meta":675,"style":675},"language-xml shiki shiki-themes material-theme-lighter github-light github-dark","\u003Clayout width=\"1920\" height=\"1080\" background=\"bg.jpg\">\n  \u003Cregion id=\"1\" width=\"1920\" height=\"1080\" top=\"0\" left=\"0\">\n    \u003Cmedia id=\"42\" type=\"video\" duration=\"30\" uri=\"video.mp4\">\n      \u003Coptions>\u003Cloop>1\u003C\u002Floop>\u003C\u002Foptions>\n    \u003C\u002Fmedia>\n    \u003Cmedia id=\"43\" type=\"image\" duration=\"10\" uri=\"image.jpg\">\n      \u003Coptions>\u003CscaleType>center\u003C\u002FscaleType>\u003C\u002Foptions>\n    \u003C\u002Fmedia>\n  \u003C\u002Fregion>\n\u003C\u002Flayout>\n","xml",[20,6896,6897,6945,7009,7066,7098,7107,7158,7184,7192,7201],{"__ignoreMap":675},[679,6898,6899,6902,6906,6910,6913,6915,6917,6919,6922,6924,6926,6928,6930,6933,6935,6937,6940,6942],{"class":681,"line":682},[679,6900,6901],{"class":685},"\u003C",[679,6903,6905],{"class":6904},"sQzsp","layout",[679,6907,6909],{"class":6908},"s9AJx"," width",[679,6911,6912],{"class":685},"=",[679,6914,699],{"class":705},[679,6916,312],{"class":709},[679,6918,699],{"class":705},[679,6920,6921],{"class":6908}," height",[679,6923,6912],{"class":685},[679,6925,699],{"class":705},[679,6927,331],{"class":709},[679,6929,699],{"class":705},[679,6931,6932],{"class":6908}," background",[679,6934,6912],{"class":685},[679,6936,699],{"class":705},[679,6938,6939],{"class":709},"bg.jpg",[679,6941,699],{"class":705},[679,6943,6944],{"class":685},">\n",[679,6946,6947,6950,6953,6956,6958,6960,6963,6965,6967,6969,6971,6973,6975,6977,6979,6981,6983,6985,6988,6990,6992,6994,6996,6999,7001,7003,7005,7007],{"class":681,"line":689},[679,6948,6949],{"class":685},"  \u003C",[679,6951,6952],{"class":6904},"region",[679,6954,6955],{"class":6908}," id",[679,6957,6912],{"class":685},[679,6959,699],{"class":705},[679,6961,6962],{"class":709},"1",[679,6964,699],{"class":705},[679,6966,6909],{"class":6908},[679,6968,6912],{"class":685},[679,6970,699],{"class":705},[679,6972,312],{"class":709},[679,6974,699],{"class":705},[679,6976,6921],{"class":6908},[679,6978,6912],{"class":685},[679,6980,699],{"class":705},[679,6982,331],{"class":709},[679,6984,699],{"class":705},[679,6986,6987],{"class":6908}," top",[679,6989,6912],{"class":685},[679,6991,699],{"class":705},[679,6993,5075],{"class":709},[679,6995,699],{"class":705},[679,6997,6998],{"class":6908}," left",[679,7000,6912],{"class":685},[679,7002,699],{"class":705},[679,7004,5075],{"class":709},[679,7006,699],{"class":705},[679,7008,6944],{"class":685},[679,7010,7011,7014,7017,7019,7021,7023,7026,7028,7031,7033,7035,7038,7040,7043,7045,7047,7050,7052,7055,7057,7059,7062,7064],{"class":681,"line":718},[679,7012,7013],{"class":685},"    \u003C",[679,7015,7016],{"class":6904},"media",[679,7018,6955],{"class":6908},[679,7020,6912],{"class":685},[679,7022,699],{"class":705},[679,7024,7025],{"class":709},"42",[679,7027,699],{"class":705},[679,7029,7030],{"class":6908}," type",[679,7032,6912],{"class":685},[679,7034,699],{"class":705},[679,7036,7037],{"class":709},"video",[679,7039,699],{"class":705},[679,7041,7042],{"class":6908}," duration",[679,7044,6912],{"class":685},[679,7046,699],{"class":705},[679,7048,7049],{"class":709},"30",[679,7051,699],{"class":705},[679,7053,7054],{"class":6908}," uri",[679,7056,6912],{"class":685},[679,7058,699],{"class":705},[679,7060,7061],{"class":709},"video.mp4",[679,7063,699],{"class":705},[679,7065,6944],{"class":685},[679,7067,7068,7071,7074,7077,7080,7083,7086,7089,7091,7094,7096],{"class":681,"line":738},[679,7069,7070],{"class":685},"      \u003C",[679,7072,7073],{"class":6904},"options",[679,7075,7076],{"class":685},">\u003C",[679,7078,7079],{"class":6904},"loop",[679,7081,7082],{"class":685},">",[679,7084,6962],{"class":7085},"su5hD",[679,7087,7088],{"class":685},"\u003C\u002F",[679,7090,7079],{"class":6904},[679,7092,7093],{"class":685},">\u003C\u002F",[679,7095,7073],{"class":6904},[679,7097,6944],{"class":685},[679,7099,7100,7103,7105],{"class":681,"line":758},[679,7101,7102],{"class":685},"    \u003C\u002F",[679,7104,7016],{"class":6904},[679,7106,6944],{"class":685},[679,7108,7109,7111,7113,7115,7117,7119,7122,7124,7126,7128,7130,7133,7135,7137,7139,7141,7143,7145,7147,7149,7151,7154,7156],{"class":681,"line":775},[679,7110,7013],{"class":685},[679,7112,7016],{"class":6904},[679,7114,6955],{"class":6908},[679,7116,6912],{"class":685},[679,7118,699],{"class":705},[679,7120,7121],{"class":709},"43",[679,7123,699],{"class":705},[679,7125,7030],{"class":6908},[679,7127,6912],{"class":685},[679,7129,699],{"class":705},[679,7131,7132],{"class":709},"image",[679,7134,699],{"class":705},[679,7136,7042],{"class":6908},[679,7138,6912],{"class":685},[679,7140,699],{"class":705},[679,7142,3803],{"class":709},[679,7144,699],{"class":705},[679,7146,7054],{"class":6908},[679,7148,6912],{"class":685},[679,7150,699],{"class":705},[679,7152,7153],{"class":709},"image.jpg",[679,7155,699],{"class":705},[679,7157,6944],{"class":685},[679,7159,7160,7162,7164,7166,7169,7171,7174,7176,7178,7180,7182],{"class":681,"line":794},[679,7161,7070],{"class":685},[679,7163,7073],{"class":6904},[679,7165,7076],{"class":685},[679,7167,7168],{"class":6904},"scaleType",[679,7170,7082],{"class":685},[679,7172,7173],{"class":7085},"center",[679,7175,7088],{"class":685},[679,7177,7168],{"class":6904},[679,7179,7093],{"class":685},[679,7181,7073],{"class":6904},[679,7183,6944],{"class":685},[679,7185,7186,7188,7190],{"class":681,"line":813},[679,7187,7102],{"class":685},[679,7189,7016],{"class":6904},[679,7191,6944],{"class":685},[679,7193,7194,7197,7199],{"class":681,"line":828},[679,7195,7196],{"class":685},"  \u003C\u002F",[679,7198,6952],{"class":6904},[679,7200,6944],{"class":685},[679,7202,7203,7205,7207],{"class":681,"line":847},[679,7204,7088],{"class":685},[679,7206,6905],{"class":6904},[679,7208,6944],{"class":685},[916,7210,7212],{"id":7211},"widget-types","Widget types",[25,7214,7215,7227],{},[28,7216,7217],{},[31,7218,7219,7221,7224],{},[34,7220,3548],{},[34,7222,7223],{},"Element",[34,7225,7226],{},"Special handling",[41,7228,7229,7240,7251,7262,7272,7284,7295],{},[31,7230,7231,7233,7237],{},[46,7232,6522],{},[46,7234,7235],{},[20,7236,6527],{},[46,7238,7239],{},"HLS.js for non-Safari, pause-on-last-frame",[31,7241,7242,7244,7248],{},[46,7243,6533],{},[46,7245,7246],{},[20,7247,6538],{},[46,7249,7250],{},"scaleType (center\u002Fstretch\u002Ffit), align\u002Fvalign",[31,7252,7253,7255,7259],{},[46,7254,6544],{},[46,7256,7257],{},[20,7258,6549],{},[46,7260,7261],{},"Gradient visualization overlay",[31,7263,7264,7266,7269],{},[46,7265,6555],{},[46,7267,7268],{},"Canvas",[46,7270,7271],{},"PDF.js (lazy-loaded), page-by-page rendering",[31,7273,7274,7276,7281],{},[46,7275,6563],{},[46,7277,7278],{},[20,7279,7280],{},"\u003Ciframe>",[46,7282,7283],{},"GetResource from CMS, NUMITEMS\u002FDURATION parsing",[31,7285,7286,7288,7292],{},[46,7287,6571],{},[46,7289,7290],{},[20,7291,7280],{},[46,7293,7294],{},"Direct src, sandboxed",[31,7296,7297,7299,7303],{},[46,7298,6581],{},[46,7300,7301],{},[20,7302,7280],{},[46,7304,7305],{},"Generic GetResource rendering",[916,7307,7309],{"id":7308},"performance-optimizations","Performance optimizations",[932,7311,7312,7322,7328,7334,7343],{},[935,7313,7314,7317,7318,7321],{},[938,7315,7316],{},"Element reuse"," — widgets are pre-created and toggled via ",[20,7319,7320],{},"visibility",", not destroyed\u002Frecreated",[935,7323,7324,7327],{},[938,7325,7326],{},"2-layout preload pool"," — next layout pre-built at 75% of current duration",[935,7329,7330,7333],{},[938,7331,7332],{},"Blob URL lifecycle"," — tracked and revoked to prevent memory leaks",[935,7335,7336,7339,7340],{},[938,7337,7338],{},"Parallel media prefetch"," — all widget media URLs fetched via ",[20,7341,7342],{},"Promise.all",[935,7344,7345,7348],{},[938,7346,7347],{},"Media-ready gating"," — layout timer starts only when all first widgets are loaded",[73,7350,7352],{"id":7351},"download-system","Download system",[916,7354,7356],{"id":7355},"chunked-parallel-downloads","Chunked parallel downloads",[16,7358,7359],{},"Large files are split into 4 parallel 50MB chunks:",[670,7361,7364],{"className":7362,"code":7363,"language":1307},[1305],"File: 200MB video.mp4\n  Chunk 1: bytes 0-49999999      (parallel)\n  Chunk 2: bytes 50000000-99999999   (parallel)\n  Chunk 3: bytes 100000000-149999999 (parallel)\n  Chunk 4: bytes 150000000-199999999 (parallel)\n  → Reassemble → MD5 verify → Store\n",[20,7365,7363],{"__ignoreMap":675},[932,7367,7368,7374,7380,7386],{},[935,7369,7370,7373],{},[938,7371,7372],{},"Header+trailer first"," — downloads first and last 1MB of MP4 for instant playback start",[935,7375,7376,7379],{},[938,7377,7378],{},"Resume"," — incomplete downloads resume from last successful chunk",[935,7381,7382,7385],{},[938,7383,7384],{},"Download windows"," — CMS-configured time restrictions honored",[935,7387,7388,7391],{},[938,7389,7390],{},"Urgent queue"," — current layout media gets priority over background downloads",[916,7393,7395],{"id":7394},"storage-layers","Storage layers",[25,7397,7398,7410],{},[28,7399,7400],{},[31,7401,7402,7405,7408],{},[34,7403,7404],{},"Layer",[34,7406,7407],{},"Technology",[34,7409,3554],{},[41,7411,7412,7423,7434],{},[31,7413,7414,7417,7420],{},[46,7415,7416],{},"ContentStore",[46,7418,7419],{},"Filesystem via proxy",[46,7421,7422],{},"Media files, layouts (Electron\u002FChromium)",[31,7424,7425,7428,7431],{},[46,7426,7427],{},"Service Worker",[46,7429,7430],{},"Cache API",[46,7432,7433],{},"Media files (PWA)",[31,7435,7436,7439,7442],{},[46,7437,7438],{},"IndexedDB",[46,7440,7441],{},"Structured data",[46,7443,7444],{},"Schedule, settings, stats, logs, file metadata",[73,7446,7448],{"id":7447},"schedule-system","Schedule system",[916,7450,7452],{"id":7451},"priority-resolution","Priority resolution",[670,7454,7457],{"className":7455,"code":7456,"language":1307},[1305],"1. Interrupt layouts (share of voice, percentage-based)\n2. Campaign layouts (highest priority wins)\n3. Default layout (lowest priority fallback)\n",[20,7458,7456],{"__ignoreMap":675},[16,7460,7461],{},"Within the same priority: layouts cycle in order with configurable duration.",[916,7463,7465],{"id":7464},"dayparting","Dayparting",[932,7467,7468,7471,7474,7477],{},[935,7469,7470],{},"Daily, weekly, monthly recurrence",[935,7472,7473],{},"Midnight-crossing support (e.g., 22:00 → 06:00)",[935,7475,7476],{},"Geo-fencing with location fallback chain (browser → Google API → IP)",[935,7478,7479],{},"Weather criteria evaluation",[916,7481,7483],{"id":7482},"layout-blacklist","Layout blacklist",[16,7485,7486],{},"Layouts that fail rendering 3 consecutive times are blacklisted and reported to CMS via the BlackList XMDS method. Blacklist resets when RequiredFiles changes.",[73,7488,7490],{"id":7489},"multi-display-sync","Multi-display sync",[16,7492,7493,7494,7496],{},"See ",[924,7495,5496],{"href":6042}," for the complete setup guide.",[16,7498,7499,702],{},[938,7500,7501],{},"Protocol summary",[932,7503,7504,7511,7517,7523],{},[935,7505,7506,7507,7510],{},"Lead broadcasts ",[20,7508,7509],{},"layout-change"," with target timestamp",[935,7512,7513,7514],{},"Followers preload → report ",[20,7515,7516],{},"ready",[935,7518,7506,7519,7522],{},[20,7520,7521],{},"layout-show"," at coordinated timestamp",[935,7524,7525],{},"All displays show simultaneously (±4ms measured, \u003C8ms guaranteed)",[73,7527,4581],{"id":4580},[25,7529,7530,7543],{},[28,7531,7532],{},[31,7533,7534,7537,7540],{},[34,7535,7536],{},"Suite",[34,7538,7539],{},"Count",[34,7541,7542],{},"Framework",[41,7544,7545,7556,7566,7577,7587,7597,7606,7616],{},[31,7546,7547,7550,7553],{},[46,7548,7549],{},"SDK unit tests",[46,7551,7552],{},"1744",[46,7554,7555],{},"Vitest + jsdom",[31,7557,7558,7561,7563],{},[46,7559,7560],{},"Electron unit",[46,7562,3793],{},[46,7564,7565],{},"Vitest",[31,7567,7568,7571,7574],{},[46,7569,7570],{},"Electron e2e",[46,7572,7573],{},"7",[46,7575,7576],{},"Playwright",[31,7578,7579,7581,7584],{},[46,7580,58],{},[46,7582,7583],{},"9",[46,7585,7586],{},"bats",[31,7588,7589,7591,7594],{},[46,7590,2006],{},[46,7592,7593],{},"18",[46,7595,7596],{},"Rust cargo test",[31,7598,7599,7601,7603],{},[46,7600,4556],{},[46,7602,7583],{},[46,7604,7605],{},"JUnit + Robolectric",[31,7607,7608,7610,7613],{},[46,7609,4569],{},[46,7611,7612],{},"11",[46,7614,7615],{},"Node.js test runner",[31,7617,7618,7623,7628],{},[46,7619,7620],{},[938,7621,7622],{},"Total",[46,7624,7625],{},[938,7626,7627],{},"1818",[46,7629],{},[16,7631,7632],{},"Integration tests run nightly against the dev CMS via Docker Compose or direct connection.",[877,7634,7635],{},"html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sQzsp, html code.shiki .sQzsp{--shiki-light:#E53935;--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .s9AJx, html code.shiki .s9AJx{--shiki-light:#9C3EDA;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":675,"searchDepth":718,"depth":718,"links":7637},[7638,7639,7643,7648,7652,7657,7658],{"id":6628,"depth":689,"text":6629},{"id":6672,"depth":689,"text":6673,"children":7640},[7641,7642],{"id":6676,"depth":718,"text":6677},{"id":6758,"depth":718,"text":6759},{"id":6881,"depth":689,"text":6882,"children":7644},[7645,7646,7647],{"id":6885,"depth":718,"text":6886},{"id":7211,"depth":718,"text":7212},{"id":7308,"depth":718,"text":7309},{"id":7351,"depth":689,"text":7352,"children":7649},[7650,7651],{"id":7355,"depth":718,"text":7356},{"id":7394,"depth":718,"text":7395},{"id":7447,"depth":689,"text":7448,"children":7653},[7654,7655,7656],{"id":7451,"depth":718,"text":7452},{"id":7464,"depth":718,"text":7465},{"id":7482,"depth":718,"text":7483},{"id":7489,"depth":689,"text":7490},{"id":4580,"depth":689,"text":4581},"Complete technical reference for the xiboplayer SDK and player ecosystem",{"order":758},"\u002Fdocs\u002Fsdk\u002Ftechnical-manual",{"title":6617,"description":7659},"docs\u002Fsdk\u002Ftechnical-manual","eHEMFvBWJv_DDSk-N0pKw5NxuVeg5PRocqvsK71Z43o",{"id":7666,"title":1767,"author":7,"body":7667,"date":7,"description":8120,"extension":893,"meta":8121,"navigation":895,"path":1822,"robots":7,"seo":8122,"stem":8123,"tags":7,"__hash__":8124},"content_en\u002Fdocs\u002Ftroubleshooting.md",{"type":9,"value":7668,"toc":8106},[7669,7671,7675,7681,7686,7705,7709,7714,7718,7735,7739,7744,7748,7776,7780,7785,7789,7816,7820,7825,7829,7848,7852,7857,7861,7893,7897,7902,7906,7924,7928,7933,7937,7954,7958,7963,7967,7999,8003,8008,8012,8041,8045,8050,8054,8071,8075,8080,8084],[12,7670,1767],{"id":1766},[73,7672,7674],{"id":7673},"display-stuck-on-setup-screen","Display stuck on setup screen",[16,7676,7677,7680],{},[938,7678,7679],{},"Symptoms",": Player shows the CMS configuration form and never progresses to content.",[16,7682,7683,702],{},[938,7684,7685],{},"Solutions",[932,7687,7688,7693,7696,7702],{},[935,7689,7690,7691],{},"Verify the CMS URL is correct and includes ",[20,7692,1618],{},[935,7694,7695],{},"Check the CMS Secret Key matches (Settings → Display Settings in CMS)",[935,7697,7698,7699],{},"Ensure the player can reach the CMS: ",[20,7700,7701],{},"curl -sf https:\u002F\u002Fyour-cms\u002Fapi\u002Fabout",[935,7703,7704],{},"Check firewall rules — the CMS must be accessible from the player's network",[73,7706,7708],{"id":7707},"content-not-updating-after-schedule-change","Content not updating after schedule change",[16,7710,7711,7713],{},[938,7712,7679],{},": You changed the schedule in CMS but the player shows old content.",[16,7715,7716,702],{},[938,7717,7685],{},[932,7719,7720,7723,7729,7732],{},[935,7721,7722],{},"Wait for the collection interval (default: 5 minutes)",[935,7724,7725,7726,7728],{},"Send ",[938,7727,1715],{}," from CMS → Displays → row menu → Send Command",[935,7730,7731],{},"Check XMR is running — real-time commands require the XMR service",[935,7733,7734],{},"Verify the schedule's date\u002Ftime range includes the current time (check timezone)",[73,7736,7738],{"id":7737},"video-not-playing","Video not playing",[16,7740,7741,7743],{},[938,7742,7679],{},": Video widget shows a black rectangle or loading indicator.",[16,7745,7746,702],{},[938,7747,7685],{},[932,7749,7750,7753,7760,7767,7770],{},[935,7751,7752],{},"Check the video codec — MP4 with H.264 is universally supported",[935,7754,7755,7756,7759],{},"For HLS streams, ensure the ",[20,7757,7758],{},".m3u8"," URL is accessible from the player",[935,7761,7762,7763,7766],{},"Electron: verify GPU acceleration is enabled (",[20,7764,7765],{},"--ignore-gpu-blocklist"," flag is default)",[935,7768,7769],{},"Check browser console for CORS errors — videos must be served from the CMS or a CORS-enabled CDN",[935,7771,7772,7773,7775],{},"Large videos: wait for the download to complete (check the download overlay with ",[20,7774,581],{}," key)",[73,7777,7779],{"id":7778},"cms-connection-refused-timeout","CMS connection refused \u002F timeout",[16,7781,7782,7784],{},[938,7783,7679],{},": Player logs show \"XMDS error\", \"fetch failed\", or \"ECONNREFUSED\".",[16,7786,7787,702],{},[938,7788,7685],{},[932,7790,7791,7797,7803,7806,7813],{},[935,7792,7793,7794],{},"Verify the CMS is running: ",[20,7795,7796],{},"curl https:\u002F\u002Fyour-cms\u002Fapi\u002Fabout",[935,7798,7799,7800],{},"Check DNS resolution from the player: ",[20,7801,7802],{},"nslookup your-cms.example.com",[935,7804,7805],{},"Verify no firewall blocks port 443 (HTTPS) or 80 (HTTP)",[935,7807,7808,7809,7812],{},"If using a self-signed certificate, set ",[20,7810,7811],{},"relaxSslCerts: true"," in config.json",[935,7814,7815],{},"Check proxy settings if the player is behind a corporate proxy",[73,7817,7819],{"id":7818},"display-shows-as-offline-in-cms","Display shows as offline in CMS",[16,7821,7822,7824],{},[938,7823,7679],{},": CMS shows the display with a red status indicator.",[16,7826,7827,702],{},[938,7828,7685],{},[932,7830,7831,7837,7840,7843],{},[935,7832,7833,7834],{},"Check the player is running: ",[20,7835,7836],{},"systemctl --user status xiboplayer-electron",[935,7838,7839],{},"Verify network connectivity from the player",[935,7841,7842],{},"Check the collection interval — a display is \"offline\" if it hasn't checked in within 2x the interval",[935,7844,7845,7846],{},"Review player logs: ",[20,7847,1415],{},[73,7849,7851],{"id":7850},"black-screen-after-boot-kiosk","Black screen after boot (kiosk)",[16,7853,7854,7856],{},[938,7855,7679],{},": Kiosk boots to a black screen, no player UI visible.",[16,7858,7859,702],{},[938,7860,7685],{},[932,7862,7863,7869,7875,7881,7887],{},[935,7864,7865,7866,7868],{},"Press ",[20,7867,611],{}," to show the status overlay (IP, CMS, player status)",[935,7870,7871,7872],{},"Check GDM is running: ",[20,7873,7874],{},"systemctl status gdm",[935,7876,7877,7878],{},"Verify the kiosk session is configured: ",[20,7879,7880],{},"cat \u002Fvar\u002Flib\u002FAccountsService\u002Fusers\u002Fxibo",[935,7882,7883,7884],{},"Check the player service: ",[20,7885,7886],{},"systemctl --user -M xibo@ status xibo-player.service",[935,7888,7889,7890],{},"Review the session log: ",[20,7891,7892],{},"journalctl --user -u gnome-kiosk-script -f",[73,7894,7896],{"id":7895},"cors-errors-in-browser-console","CORS errors in browser console",[16,7898,7899,7901],{},[938,7900,7679],{},": Console shows \"Access-Control-Allow-Origin\" errors, resources fail to load.",[16,7903,7904,702],{},[938,7905,7685],{},[932,7907,7908,7913,7918,7921],{},[935,7909,7910,7912],{},[938,7911,68],{},": Must be served from the same origin as the CMS, or use the proxy",[935,7914,7915,7917],{},[938,7916,2653],{},": The built-in proxy handles CORS automatically — this should not happen",[935,7919,7920],{},"Check that the proxy server is running on the expected port (8765 for Electron, 8766 for Chromium)",[935,7922,7923],{},"If using a reverse proxy (nginx\u002FSWAG), ensure it passes CORS headers",[73,7925,7927],{"id":7926},"schedule-not-appearing-at-correct-times","Schedule not appearing at correct times",[16,7929,7930,7932],{},[938,7931,7679],{},": Content shows at wrong times or not at all during scheduled periods.",[16,7934,7935,702],{},[938,7936,7685],{},[932,7938,7939,7942,7945,7948],{},[935,7940,7941],{},"Verify the player's timezone matches the CMS timezone",[935,7943,7944],{},"Check the schedule's dayparting settings in CMS",[935,7946,7947],{},"Campaign priority: higher-priority campaigns override lower ones",[935,7949,7950,7951,7953],{},"Use the timeline overlay (",[20,7952,591],{}," key in the player) to see what's scheduled",[73,7955,7957],{"id":7956},"player-high-cpu-usage","Player high CPU usage",[16,7959,7960,7962],{},[938,7961,7679],{},": CPU usage above 20% during normal playback.",[16,7964,7965,702],{},[938,7966,7685],{},[932,7968,7969,7978,7990,7993,7996],{},[935,7970,7971,7973,7974,7977],{},[938,7972,48],{},": Ensure GPU acceleration is working — check ",[20,7975,7976],{},"chrome:\u002F\u002Fgpu"," in dev mode",[935,7979,7980,7982,7983,1034,7986,7989],{},[938,7981,58],{},": Verify ",[20,7984,7985],{},"--enable-gpu-rasterization",[20,7987,7988],{},"--enable-zero-copy"," flags are applied",[935,7991,7992],{},"Check for complex layouts with many regions or heavy JavaScript widgets",[935,7994,7995],{},"Review video resolution — 4K video on a 1080p display wastes resources",[935,7997,7998],{},"Expected: 4-5% CPU in production with GPU acceleration enabled",[73,8000,8002],{"id":8001},"screenshots-not-submitting","Screenshots not submitting",[16,8004,8005,8007],{},[938,8006,7679],{},": CMS shows no screenshots for the display.",[16,8009,8010,702],{},[938,8011,7685],{},[932,8013,8014,8021,8028,8035],{},[935,8015,8016,8017,8020],{},"Check ",[20,8018,8019],{},"screenshotInterval"," in display settings (CMS → Display Settings)",[935,8022,8023,8024,8027],{},"Electron uses ",[20,8025,8026],{},"desktopCapturer"," API — requires a display",[935,8029,8030,8031,8034],{},"Chromium falls back to ",[20,8032,8033],{},"html2canvas"," — check browser console for errors",[935,8036,8037,8038],{},"Verify the CMS can receive uploads — check PHP ",[20,8039,8040],{},"upload_max_filesize",[73,8042,8044],{"id":8043},"xmr-commands-not-received","XMR commands not received",[16,8046,8047,8049],{},[938,8048,7679],{},": Collect Now, screenshot, and other real-time commands don't work.",[16,8051,8052,702],{},[938,8053,7685],{},[932,8055,8056,8059,8062,8065,8068],{},[935,8057,8058],{},"Verify XMR is running on the CMS server",[935,8060,8061],{},"Check the XMR public address is reachable from the player (default: port 9505)",[935,8063,8064],{},"Review the player's XMR connection log for WebSocket errors",[935,8066,8067],{},"Ensure the display's hardware key matches the registered key in CMS",[935,8069,8070],{},"Restart the player to force a new XMR channel registration",[73,8072,8074],{"id":8073},"display-registered-but-no-content","Display registered but no content",[16,8076,8077,8079],{},[938,8078,7679],{},": Display is authorized in CMS but shows \"No scheduled content\" or the default layout.",[16,8081,8082,702],{},[938,8083,7685],{},[932,8085,8086,8089,8092,8095,8100],{},[935,8087,8088],{},"Create a campaign in CMS and schedule it for the display or its display group",[935,8090,8091],{},"Check the schedule's date range includes today",[935,8093,8094],{},"Verify the display is in the correct Display Group",[935,8096,7725,8097,8099],{},[938,8098,1715],{}," to trigger an immediate schedule refresh",[935,8101,8102,8103,8105],{},"Check the player's timeline overlay (",[20,8104,591],{}," key) to see the current schedule",{"title":675,"searchDepth":718,"depth":718,"links":8107},[8108,8109,8110,8111,8112,8113,8114,8115,8116,8117,8118,8119],{"id":7673,"depth":689,"text":7674},{"id":7707,"depth":689,"text":7708},{"id":7737,"depth":689,"text":7738},{"id":7778,"depth":689,"text":7779},{"id":7818,"depth":689,"text":7819},{"id":7850,"depth":689,"text":7851},{"id":7895,"depth":689,"text":7896},{"id":7926,"depth":689,"text":7927},{"id":7956,"depth":689,"text":7957},{"id":8001,"depth":689,"text":8002},{"id":8043,"depth":689,"text":8044},{"id":8073,"depth":689,"text":8074},"Solutions for common xiboplayer issues",{"order":682},{"title":1767,"description":8120},"docs\u002Ftroubleshooting","nsziBEfrbdrFIAnQ6kEl6WBJq-C9fDxh-GaJJzzCaCU",1777158201636]