[{"data":1,"prerenderedAt":271},["ShallowReactive",2],{"content-en-\u002Fsdk\u002Fdeployment":3},{"id":4,"title":5,"author":6,"body":7,"date":6,"description":263,"extension":264,"meta":265,"navigation":266,"path":267,"seo":268,"stem":269,"tags":6,"__hash__":270},"content_en\u002Fsdk\u002Fdeployment.md","PWA Deployment",null,{"type":8,"value":9,"toc":255},"minimark",[10,14,19,30,37,40,44,89,93,116,140,144,163,167,170,188,192,251],[11,12,5],"h1",{"id":13},"pwa-deployment",[15,16,18],"h2",{"id":17},"architecture","Architecture",[20,21,26],"pre",{"className":22,"code":24,"language":25},[23],"language-text","User Browser\n    ↓ HTTPS\nhttps:\u002F\u002Fyour-cms.example.com\u002Fplayer\u002Fpwa\u002F\n    ↓\nReverse Proxy (SWAG\u002Fnginx, Port 443)\n    ↓\nXibo CMS container\n    ↓\nweb\u002Fchromeos\u002F → PWA Player Files (HTML\u002FJS\u002FCSS)\n","text",[27,28,24],"code",{"__ignoreMap":29},"",[31,32,33],"p",{},[34,35,36],"strong",{},"Same origin = No CORS issues.",[31,38,39],{},"The PWA must be served from the same domain as the CMS. All API calls (REST, SOAP, file downloads) target the CMS origin.",[15,41,43],{"id":42},"build","Build",[20,45,49],{"className":46,"code":47,"language":48,"meta":29,"style":29},"language-bash shiki shiki-themes material-theme-lighter github-light github-dark","# From the xiboplayer monorepo\npnpm install\npnpm --filter @xiboplayer\u002Fpwa build    # Production bundle → packages\u002Fpwa\u002Fdist\u002F\n","bash",[27,50,51,60,71],{"__ignoreMap":29},[52,53,56],"span",{"class":54,"line":55},"line",1,[52,57,59],{"class":58},"sutJx","# From the xiboplayer monorepo\n",[52,61,63,67],{"class":54,"line":62},2,[52,64,66],{"class":65},"sbgvK","pnpm",[52,68,70],{"class":69},"s_sjI"," install\n",[52,72,74,76,80,83,86],{"class":54,"line":73},3,[52,75,66],{"class":65},[52,77,79],{"class":78},"stzsN"," --filter",[52,81,82],{"class":69}," @xiboplayer\u002Fpwa",[52,84,85],{"class":69}," build",[52,87,88],{"class":58},"    # Production bundle → packages\u002Fpwa\u002Fdist\u002F\n",[15,90,92],{"id":91},"deploy-to-cms","Deploy to CMS",[31,94,95,96,99,100,103,104,107,108,111,112,115],{},"Copy ",[27,97,98],{},"dist\u002F*"," into the CMS container's ",[27,101,102],{},"web\u002Fchromeos\u002F"," directory. The CMS ",[27,105,106],{},".htaccess"," rewrites ",[27,109,110],{},"\u002Fplayer\u002Fpwa\u002F*"," → ",[27,113,114],{},"web\u002Fchromeos\u002F*",".",[20,117,119],{"className":46,"code":118,"language":48,"meta":29,"style":29},"# Example with podman\npodman cp dist\u002F. xibo-cms-web:\u002Fvar\u002Fwww\u002Fcms\u002Fweb\u002Fchromeos\u002F\n",[27,120,121,126],{"__ignoreMap":29},[52,122,123],{"class":54,"line":55},[52,124,125],{"class":58},"# Example with podman\n",[52,127,128,131,134,137],{"class":54,"line":62},[52,129,130],{"class":65},"podman",[52,132,133],{"class":69}," cp",[52,135,136],{"class":69}," dist\u002F.",[52,138,139],{"class":69}," xibo-cms-web:\u002Fvar\u002Fwww\u002Fcms\u002Fweb\u002Fchromeos\u002F\n",[15,141,143],{"id":142},"verify","Verify",[145,146,147,154,157,160],"ol",{},[148,149,150,151],"li",{},"Open ",[27,152,153],{},"https:\u002F\u002Fyour-cms.example.com\u002Fplayer\u002Fpwa\u002F",[148,155,156],{},"Setup page should appear on first visit",[148,158,159],{},"Enter CMS address (same domain), CMS key, display name",[148,161,162],{},"Player connects and starts showing layouts",[15,164,166],{"id":165},"alternative-electron-or-chromium-for-kioskdesktop","Alternative: Electron or Chromium (for kiosk\u002Fdesktop)",[31,168,169],{},"For local or kiosk deployments where same-origin hosting isn't available, the Electron and Chromium wrappers include a built-in proxy server that handles CORS.",[171,172,173,181],"ul",{},[148,174,175,180],{},[176,177,179],"a",{"href":178},"\u002Fplayers\u002Felectron","Electron Player"," — bundles its own browser",[148,182,183,187],{},[176,184,186],{"href":185},"\u002Fplayers\u002Fchromium","Chromium Player"," — uses the system browser",[15,189,191],{"id":190},"file-locations","File Locations",[193,194,195,208],"table",{},[196,197,198],"thead",{},[199,200,201,205],"tr",{},[202,203,204],"th",{},"Environment",[202,206,207],{},"Path",[209,210,211,222,232,242],"tbody",{},[199,212,213,217],{},[214,215,216],"td",{},"Source",[214,218,219],{},[27,220,221],{},"src\u002F",[199,223,224,227],{},[214,225,226],{},"Build output",[214,228,229],{},[27,230,231],{},"dist\u002F",[199,233,234,237],{},[214,235,236],{},"CMS container",[214,238,239],{},[27,240,241],{},"\u002Fvar\u002Fwww\u002Fcms\u002Fweb\u002Fchromeos\u002F",[199,243,244,247],{},[214,245,246],{},"URL",[214,248,249],{},[27,250,153],{},[252,253,254],"style",{},"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);}",{"title":29,"searchDepth":73,"depth":73,"links":256},[257,258,259,260,261,262],{"id":17,"depth":62,"text":18},{"id":42,"depth":62,"text":43},{"id":91,"depth":62,"text":92},{"id":142,"depth":62,"text":143},{"id":165,"depth":62,"text":166},{"id":190,"depth":62,"text":191},"Deploy the XiboPlayer PWA to your Xibo CMS.","md",{},true,"\u002Fsdk\u002Fdeployment",{"title":5,"description":263},"sdk\u002Fdeployment","UAZVJ-UCHMbe4-vxFAaKyP9McaAy1TwfU2sVmsm-U70",1775148105254]