feat: complete rebranding to SwiftDisplay, fix .htaccess loop, replace emojis with FA, fix screenshot 500 error

This commit is contained in:
xadyz1 2026-07-26 20:20:49 +01:00
parent c3bebc06b7
commit 1cc440a0c6
39 changed files with 594 additions and 554 deletions

View file

@ -2,9 +2,9 @@
<html lang="en">
<head>
<meta charset="utf-8"/>
<title>ScreenTinker API Reference</title>
<title>SwiftDisplay API Reference</title>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta name="description" content="ScreenTinker public API reference"/>
<meta name="description" content="SwiftDisplay public API reference"/>
<style>body { margin: 0; padding: 0; }</style>
</head>
<body>

View file

@ -3,23 +3,23 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Best Anthias Alternative (2026): ScreenTinker vs Anthias | ScreenTinker</title>
<meta name="description" content="Looking for an Anthias (Screenly OSE) alternative? ScreenTinker is also free, open source, and self-hostable - but adds a modern web dashboard, multi-device fleet management, video walls, and players beyond the Raspberry Pi.">
<title>Best Anthias Alternative (2026): SwiftDisplay vs Anthias | SwiftDisplay</title>
<meta name="description" content="Looking for an Anthias (Screenly OSE) alternative? SwiftDisplay is also free, open source, and self-hostable - but adds a modern web dashboard, multi-device fleet management, video walls, and players beyond the Raspberry Pi.">
<meta name="keywords" content="anthias alternative, screenly ose alternative, open source digital signage, self hosted digital signage, digital signage cms">
<meta name="robots" content="index, follow">
<link rel="canonical" href="https://screentinker.com/compare/anthias-alternative.html">
<link rel="canonical" href="https://swiftdisplay.com/compare/anthias-alternative.html">
<meta property="og:type" content="article">
<meta property="og:url" content="https://screentinker.com/compare/anthias-alternative.html">
<meta property="og:title" content="Best Anthias Alternative (2026): ScreenTinker vs Anthias | ScreenTinker">
<meta property="og:description" content="ScreenTinker vs Anthias. Also free and open source, but with fleet management, video walls, and players beyond the Raspberry Pi.">
<meta property="og:image" content="https://screentinker.com/assets/dashboard-preview.png">
<meta property="og:site_name" content="ScreenTinker">
<meta property="og:url" content="https://swiftdisplay.com/compare/anthias-alternative.html">
<meta property="og:title" content="Best Anthias Alternative (2026): SwiftDisplay vs Anthias | SwiftDisplay">
<meta property="og:description" content="SwiftDisplay vs Anthias. Also free and open source, but with fleet management, video walls, and players beyond the Raspberry Pi.">
<meta property="og:image" content="https://swiftdisplay.com/assets/dashboard-preview.png">
<meta property="og:site_name" content="SwiftDisplay">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Best Anthias Alternative (2026): ScreenTinker vs Anthias">
<meta name="twitter:description" content="ScreenTinker vs Anthias. Also free and open source, but with fleet management, video walls, and players beyond the Raspberry Pi.">
<meta name="twitter:image" content="https://screentinker.com/assets/dashboard-preview.png">
<meta name="twitter:title" content="Best Anthias Alternative (2026): SwiftDisplay vs Anthias">
<meta name="twitter:description" content="SwiftDisplay vs Anthias. Also free and open source, but with fleet management, video walls, and players beyond the Raspberry Pi.">
<meta name="twitter:image" content="https://swiftdisplay.com/assets/dashboard-preview.png">
<meta name="theme-color" content="#111827">
<link rel="icon" href="/assets/icon-192.png">
@ -32,7 +32,7 @@
<div class="nav-logo">
<a href="/" style="display:flex;align-items:center;gap:10px">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="2" y="3" width="20" height="14" rx="2"/><line x1="8" y1="21" x2="16" y2="21"/><line x1="12" y1="17" x2="12" y2="21"/></svg>
<span class="nav-logo-text">ScreenTinker</span>
<span class="nav-logo-text">SwiftDisplay</span>
</a>
</div>
<div class="nav-links">
@ -55,18 +55,18 @@
<span>Anthias Alternative</span>
</nav>
<h1>Best Anthias Alternative (2026): ScreenTinker vs Anthias</h1>
<p class="lead">Anthias (formerly Screenly OSE) is a beloved free, open-source signage project for the Raspberry Pi. But it is built around one Pi driving one screen. Here is an honest comparison with ScreenTinker for anyone who needs to manage more than a single display.</p>
<h1>Best Anthias Alternative (2026): SwiftDisplay vs Anthias</h1>
<p class="lead">Anthias (formerly Screenly OSE) is a beloved free, open-source signage project for the Raspberry Pi. But it is built around one Pi driving one screen. Here is an honest comparison with SwiftDisplay for anyone who needs to manage more than a single display.</p>
<h2>The short answer</h2>
<p><strong>Anthias</strong> is free, open source, and has been active since 2012 with around 3,500 GitHub stars. It runs on the Raspberry Pi 2 through 5 and positions itself as "free digital signage for everyone - no subscriptions, no cloud lock-in." It is essentially one-Pi-one-screen: single-screen oriented, with no multi-tenant or team management and a thin widget ecosystem. (Screenly is the paid-cloud parent product.)</p>
<p><strong>ScreenTinker</strong> is also free, open source (MIT), and self-hostable - but it adds a modern web dashboard, multi-device fleet management, video walls with multi-screen sync, group sync, scheduling and dayparting, players well beyond the Pi, and an optional managed cloud. It is the better fit the moment you go past a single screen.</p>
<p><strong>SwiftDisplay</strong> is also free, open source (MIT), and self-hostable - but it adds a modern web dashboard, multi-device fleet management, video walls with multi-screen sync, group sync, scheduling and dayparting, players well beyond the Pi, and an optional managed cloud. It is the better fit the moment you go past a single screen.</p>
<h2>Quick comparison</h2>
<div class="compare-table-wrap">
<table class="compare-table">
<thead>
<tr><th>Feature</th><th>ScreenTinker</th><th>Anthias</th></tr>
<tr><th>Feature</th><th>SwiftDisplay</th><th>Anthias</th></tr>
</thead>
<tbody>
<tr><td>Open source</td><td class="yes">Yes (MIT)</td><td class="yes">Yes</td></tr>
@ -89,7 +89,7 @@
</div>
<p style="font-size:12px;color:var(--dim);line-height:1.6;margin-top:12px">
* Live remote control is Android only and requires granting the on-device accessibility permission.<br>
Comparison as of July 2026, based on each project's publicly listed documentation and repositories. Spot an error? <a href="https://github.com/screentinker/screentinker/issues" target="_blank" rel="noopener">Open an issue on GitHub</a> and we'll fix it.
Comparison as of July 2026, based on each project's publicly listed documentation and repositories. Spot an error? <a href="https://github.com/swiftdisplay/swiftdisplay/issues" target="_blank" rel="noopener">Open an issue on GitHub</a> and we'll fix it.
</p>
<h2>Where Anthias does well</h2>
@ -99,23 +99,23 @@
<li><strong>Low footprint.</strong> Purpose-built for the Pi, so it runs well on modest hardware.</li>
</ul>
<h2>Where ScreenTinker is the better choice</h2>
<h2>Where SwiftDisplay is the better choice</h2>
<ul>
<li><strong>You have more than one screen.</strong> Anthias is single-screen oriented with no multi-tenant or team management. ScreenTinker is built around multi-device fleet management from the start.</li>
<li><strong>You need video walls or synced screens.</strong> ScreenTinker does video walls with multi-screen sync and per-group synchronized playback. Anthias does not.</li>
<li><strong>You run mixed hardware.</strong> Beyond the Pi, ScreenTinker has native players for Android TV, Fire TV, Samsung Tizen, LG webOS, Amazon Vega OS, and any web browser. Anthias is Raspberry Pi only.</li>
<li><strong>You have more than one screen.</strong> Anthias is single-screen oriented with no multi-tenant or team management. SwiftDisplay is built around multi-device fleet management from the start.</li>
<li><strong>You need video walls or synced screens.</strong> SwiftDisplay does video walls with multi-screen sync and per-group synchronized playback. Anthias does not.</li>
<li><strong>You run mixed hardware.</strong> Beyond the Pi, SwiftDisplay has native players for Android TV, Fire TV, Samsung Tizen, LG webOS, Amazon Vega OS, and any web browser. Anthias is Raspberry Pi only.</li>
<li><strong>You want real scheduling and widgets.</strong> Dayparting, content expiry, and native widgets (YouTube, RSS, Weather, Clock, plus a universal Webpage widget for any framable URL) go well past Anthias's basic scheduling and thin widget set.</li>
<li><strong>You want the option of managed cloud later.</strong> Self-host for free now, and move to the managed cloud without changing products if you ever want hosting handled for you.</li>
</ul>
<h2>Pricing snapshot</h2>
<p>Both Anthias and self-hosted ScreenTinker are <strong>free and open source</strong> - Anthias on your Raspberry Pi, ScreenTinker on a $5 VPS that comfortably runs hundreds of screens. The difference is not price but reach: ScreenTinker adds fleet management, video walls, group sync, and multi-platform players at the same free-and-self-hosted price point, plus an optional managed cloud (Free, Starter $39/mo, Pro $99/mo) if you would rather not run a server.</p>
<p>Both Anthias and self-hosted SwiftDisplay are <strong>free and open source</strong> - Anthias on your Raspberry Pi, SwiftDisplay on a $5 VPS that comfortably runs hundreds of screens. The difference is not price but reach: SwiftDisplay adds fleet management, video walls, group sync, and multi-platform players at the same free-and-self-hosted price point, plus an optional managed cloud (Free, Starter $39/mo, Pro $99/mo) if you would rather not run a server.</p>
<div class="related">
<h2>Related guides</h2>
<ul>
<li><a href="/compare/xibo-alternative.html">Compare: ScreenTinker vs Xibo</a></li>
<li><a href="/compare/yodeck-alternative.html">Compare: ScreenTinker vs Yodeck</a></li>
<li><a href="/compare/xibo-alternative.html">Compare: SwiftDisplay vs Xibo</a></li>
<li><a href="/compare/yodeck-alternative.html">Compare: SwiftDisplay vs Yodeck</a></li>
<li><a href="/guides/raspberry-pi-digital-signage.html">How to set up digital signage on a Raspberry Pi</a></li>
<li><a href="/guides/self-hosted-digital-signage.html">Self-hosted digital signage: complete guide</a></li>
<li><a href="/guides/open-source-digital-signage.html">Open-source digital signage: complete guide</a></li>
@ -123,17 +123,17 @@
</div>
<div class="cta">
<h2>Try ScreenTinker free</h2>
<h2>Try SwiftDisplay free</h2>
<p>Start a 14-day Pro trial. No credit card required.</p>
<a href="/app#/login" class="btn btn-primary" style="padding:14px 28px;font-size:16px">Start Free Trial</a>
<a href="https://github.com/screentinker/screentinker" target="_blank" rel="noopener" class="btn btn-outline" style="padding:14px 28px;font-size:16px;margin-left:12px">View on GitHub</a>
<a href="https://github.com/swiftdisplay/swiftdisplay" target="_blank" rel="noopener" class="btn btn-outline" style="padding:14px 28px;font-size:16px;margin-left:12px">View on GitHub</a>
</div>
</main>
<footer>
<div style="color:var(--dim);font-size:13px">&copy; 2026 ScreenTinker. All rights reserved.</div>
<div style="color:var(--dim);font-size:13px">&copy; 2026 SwiftDisplay. All rights reserved.</div>
<div class="links">
<a href="https://github.com/screentinker/screentinker" target="_blank" rel="noopener">GitHub</a>
<a href="https://github.com/swiftdisplay/swiftdisplay" target="_blank" rel="noopener">GitHub</a>
<a href="https://discord.gg/utTdsrqq4Z" target="_blank" rel="noopener">Discord</a>
<a href="/legal/terms.html">Terms</a>
<a href="/legal/privacy.html">Privacy</a>
@ -147,9 +147,9 @@
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{ "@type": "ListItem", "position": 1, "name": "Home", "item": "https://screentinker.com/" },
{ "@type": "ListItem", "position": 2, "name": "Compare", "item": "https://screentinker.com/#compare" },
{ "@type": "ListItem", "position": 3, "name": "Anthias Alternative", "item": "https://screentinker.com/compare/anthias-alternative.html" }
{ "@type": "ListItem", "position": 1, "name": "Home", "item": "https://swiftdisplay.com/" },
{ "@type": "ListItem", "position": 2, "name": "Compare", "item": "https://swiftdisplay.com/#compare" },
{ "@type": "ListItem", "position": 3, "name": "Anthias Alternative", "item": "https://swiftdisplay.com/compare/anthias-alternative.html" }
]
}
</script>

View file

@ -3,23 +3,23 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Best OptiSigns Alternative (2026) - Free & Open Source | ScreenTinker</title>
<meta name="description" content="Looking for an OptiSigns alternative? ScreenTinker is open source, MIT licensed, self-hostable, and costs less at scale. Honest feature and pricing comparison.">
<title>Best OptiSigns Alternative (2026) - Free & Open Source | SwiftDisplay</title>
<meta name="description" content="Looking for an OptiSigns alternative? SwiftDisplay is open source, MIT licensed, self-hostable, and costs less at scale. Honest feature and pricing comparison.">
<meta name="keywords" content="optisigns alternative, free optisigns alternative, open source digital signage, self hosted digital signage, digital signage cms">
<meta name="robots" content="index, follow">
<link rel="canonical" href="https://screentinker.com/compare/optisigns-alternative.html">
<link rel="canonical" href="https://swiftdisplay.com/compare/optisigns-alternative.html">
<meta property="og:type" content="article">
<meta property="og:url" content="https://screentinker.com/compare/optisigns-alternative.html">
<meta property="og:title" content="Best OptiSigns Alternative (2026) | ScreenTinker">
<meta property="og:description" content="ScreenTinker vs OptiSigns. Open source, self-hostable, lower cost at scale.">
<meta property="og:image" content="https://screentinker.com/assets/dashboard-preview.png">
<meta property="og:site_name" content="ScreenTinker">
<meta property="og:url" content="https://swiftdisplay.com/compare/optisigns-alternative.html">
<meta property="og:title" content="Best OptiSigns Alternative (2026) | SwiftDisplay">
<meta property="og:description" content="SwiftDisplay vs OptiSigns. Open source, self-hostable, lower cost at scale.">
<meta property="og:image" content="https://swiftdisplay.com/assets/dashboard-preview.png">
<meta property="og:site_name" content="SwiftDisplay">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Best OptiSigns Alternative (2026)">
<meta name="twitter:description" content="ScreenTinker vs OptiSigns. Open source, self-hostable, lower cost at scale.">
<meta name="twitter:image" content="https://screentinker.com/assets/dashboard-preview.png">
<meta name="twitter:description" content="SwiftDisplay vs OptiSigns. Open source, self-hostable, lower cost at scale.">
<meta name="twitter:image" content="https://swiftdisplay.com/assets/dashboard-preview.png">
<meta name="theme-color" content="#111827">
<link rel="icon" href="/assets/icon-192.png">
@ -32,7 +32,7 @@
<div class="nav-logo">
<a href="/" style="display:flex;align-items:center;gap:10px">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="2" y="3" width="20" height="14" rx="2"/><line x1="8" y1="21" x2="16" y2="21"/><line x1="12" y1="17" x2="12" y2="21"/></svg>
<span class="nav-logo-text">ScreenTinker</span>
<span class="nav-logo-text">SwiftDisplay</span>
</a>
</div>
<div class="nav-links">
@ -55,18 +55,18 @@
<span>OptiSigns Alternative</span>
</nav>
<h1>Best OptiSigns Alternative (2026): ScreenTinker vs OptiSigns</h1>
<p class="lead">OptiSigns has built a strong reputation in restaurants, retail, and small business signage. Here is an honest comparison with ScreenTinker covering features, pricing, and where each fits best.</p>
<h1>Best OptiSigns Alternative (2026): SwiftDisplay vs OptiSigns</h1>
<p class="lead">OptiSigns has built a strong reputation in restaurants, retail, and small business signage. Here is an honest comparison with SwiftDisplay covering features, pricing, and where each fits best.</p>
<h2>The short answer</h2>
<p><strong>OptiSigns</strong> is a well-marketed cloud signage product with a deep template library and good documentation. It targets non-technical buyers and works particularly well for restaurants and retail menus.</p>
<p><strong>ScreenTinker</strong> is open source (MIT licensed), self-hostable, runs on hardware you already own with no lock-in, and is meaningfully cheaper at higher screen counts. It is a better fit if you have any technical capacity, you care about data sovereignty, or you operate at a scale where per-screen pricing hurts.</p>
<p><strong>SwiftDisplay</strong> is open source (MIT licensed), self-hostable, runs on hardware you already own with no lock-in, and is meaningfully cheaper at higher screen counts. It is a better fit if you have any technical capacity, you care about data sovereignty, or you operate at a scale where per-screen pricing hurts.</p>
<h2>Quick comparison</h2>
<div class="compare-table-wrap">
<table class="compare-table">
<thead>
<tr><th>Feature</th><th>ScreenTinker</th><th>OptiSigns</th></tr>
<tr><th>Feature</th><th>SwiftDisplay</th><th>OptiSigns</th></tr>
</thead>
<tbody>
<tr><td>Open source</td><td class="yes">Yes (MIT)</td><td class="no">No</td></tr>
@ -88,7 +88,7 @@
</div>
<p style="font-size:12px;color:var(--dim);line-height:1.6;margin-top:12px">
* Live remote control is Android only and requires granting the on-device accessibility permission.<br>
Comparison as of June 2026, based on each vendor's publicly listed pricing and documentation. Spot an error? <a href="https://github.com/screentinker/screentinker/issues" target="_blank" rel="noopener">Open an issue on GitHub</a> and we'll fix it.
Comparison as of June 2026, based on each vendor's publicly listed pricing and documentation. Spot an error? <a href="https://github.com/swiftdisplay/swiftdisplay/issues" target="_blank" rel="noopener">Open an issue on GitHub</a> and we'll fix it.
</p>
<h2>Where OptiSigns does well</h2>
@ -98,11 +98,11 @@
<li><strong>Documentation and support.</strong> Extensive tutorial library, responsive support team.</li>
</ul>
<h2>Where ScreenTinker is the better choice</h2>
<h2>Where SwiftDisplay is the better choice</h2>
<ul>
<li><strong>Cost at scale.</strong> OptiSigns is around $11/screen/month on the Pro plan. At 15 devices that is $165/mo; ScreenTinker Pro is $99/mo. The gap widens as you add screens.</li>
<li><strong>Self-hosting.</strong> If you cannot or will not put your signage data in a third-party cloud, ScreenTinker is one of the few real options. OptiSigns does not offer this.</li>
<li><strong>Source access.</strong> MIT licensed on <a href="https://github.com/screentinker/screentinker" target="_blank" rel="noopener">GitHub</a>. Read the code, modify it, fork it.</li>
<li><strong>Cost at scale.</strong> OptiSigns is around $11/screen/month on the Pro plan. At 15 devices that is $165/mo; SwiftDisplay Pro is $99/mo. The gap widens as you add screens.</li>
<li><strong>Self-hosting.</strong> If you cannot or will not put your signage data in a third-party cloud, SwiftDisplay is one of the few real options. OptiSigns does not offer this.</li>
<li><strong>Source access.</strong> MIT licensed on <a href="https://github.com/swiftdisplay/swiftdisplay" target="_blank" rel="noopener">GitHub</a>. Read the code, modify it, fork it.</li>
<li><strong>Live remote control.</strong> Stream a live view of any display and inject taps or key events. Most cloud signage tools only show occasional screenshots.</li>
<li><strong>Runs on hardware you already own.</strong> Native Android APK, web player works on any browser, Pi setup script, Windows-friendly, macOS-friendly - no proprietary player to buy.</li>
</ul>
@ -110,7 +110,7 @@
<h2>Pricing example: 25 devices for one year</h2>
<ul>
<li><strong>OptiSigns Pro:</strong> ~$3,300/year (25 x $11/mo)</li>
<li><strong>ScreenTinker:</strong> Custom Enterprise plan or self-host at server cost only</li>
<li><strong>SwiftDisplay:</strong> Custom Enterprise plan or self-host at server cost only</li>
</ul>
<div class="related">
@ -119,23 +119,23 @@
<li><a href="/guides/raspberry-pi-digital-signage.html">How to set up digital signage on a Raspberry Pi</a></li>
<li><a href="/guides/digital-signage-android-tv.html">Free digital signage for Android TV and Fire TV</a></li>
<li><a href="/guides/self-hosted-digital-signage.html">Self-hosted digital signage: complete guide</a></li>
<li><a href="/compare/yodeck-alternative.html">Compare: ScreenTinker vs Yodeck</a></li>
<li><a href="/compare/screencloud-alternative.html">Compare: ScreenTinker vs ScreenCloud</a></li>
<li><a href="/compare/yodeck-alternative.html">Compare: SwiftDisplay vs Yodeck</a></li>
<li><a href="/compare/screencloud-alternative.html">Compare: SwiftDisplay vs ScreenCloud</a></li>
</ul>
</div>
<div class="cta">
<h2>Try ScreenTinker free</h2>
<h2>Try SwiftDisplay free</h2>
<p>Start a 14-day Pro trial. No credit card required.</p>
<a href="/app#/login" class="btn btn-primary" style="padding:14px 28px;font-size:16px">Start Free Trial</a>
<a href="https://github.com/screentinker/screentinker" target="_blank" rel="noopener" class="btn btn-outline" style="padding:14px 28px;font-size:16px;margin-left:12px">View on GitHub</a>
<a href="https://github.com/swiftdisplay/swiftdisplay" target="_blank" rel="noopener" class="btn btn-outline" style="padding:14px 28px;font-size:16px;margin-left:12px">View on GitHub</a>
</div>
</main>
<footer>
<div style="color:var(--dim);font-size:13px">&copy; 2026 ScreenTinker. All rights reserved.</div>
<div style="color:var(--dim);font-size:13px">&copy; 2026 SwiftDisplay. All rights reserved.</div>
<div class="links">
<a href="https://github.com/screentinker/screentinker" target="_blank" rel="noopener">GitHub</a>
<a href="https://github.com/swiftdisplay/swiftdisplay" target="_blank" rel="noopener">GitHub</a>
<a href="https://discord.gg/utTdsrqq4Z" target="_blank" rel="noopener">Discord</a>
<a href="/legal/terms.html">Terms</a>
<a href="/legal/privacy.html">Privacy</a>
@ -149,9 +149,9 @@
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{ "@type": "ListItem", "position": 1, "name": "Home", "item": "https://screentinker.com/" },
{ "@type": "ListItem", "position": 2, "name": "Compare", "item": "https://screentinker.com/#compare" },
{ "@type": "ListItem", "position": 3, "name": "OptiSigns Alternative", "item": "https://screentinker.com/compare/optisigns-alternative.html" }
{ "@type": "ListItem", "position": 1, "name": "Home", "item": "https://swiftdisplay.com/" },
{ "@type": "ListItem", "position": 2, "name": "Compare", "item": "https://swiftdisplay.com/#compare" },
{ "@type": "ListItem", "position": 3, "name": "OptiSigns Alternative", "item": "https://swiftdisplay.com/compare/optisigns-alternative.html" }
]
}
</script>

View file

@ -3,23 +3,23 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Best ScreenCloud Alternative (2026) - Free & Open Source | ScreenTinker</title>
<meta name="description" content="ScreenCloud is great but expensive at scale. ScreenTinker is open source, MIT licensed, self-hostable, and a fraction of the price for the same screen count. Compare features, pricing, and platform support.">
<title>Best ScreenCloud Alternative (2026) - Free & Open Source | SwiftDisplay</title>
<meta name="description" content="ScreenCloud is great but expensive at scale. SwiftDisplay is open source, MIT licensed, self-hostable, and a fraction of the price for the same screen count. Compare features, pricing, and platform support.">
<meta name="keywords" content="screencloud alternative, free screencloud alternative, open source digital signage, self hosted digital signage, digital signage cms">
<meta name="robots" content="index, follow">
<link rel="canonical" href="https://screentinker.com/compare/screencloud-alternative.html">
<link rel="canonical" href="https://swiftdisplay.com/compare/screencloud-alternative.html">
<meta property="og:type" content="article">
<meta property="og:url" content="https://screentinker.com/compare/screencloud-alternative.html">
<meta property="og:title" content="Best ScreenCloud Alternative (2026) | ScreenTinker">
<meta property="og:description" content="ScreenTinker vs ScreenCloud. Open source, self-hostable, dramatically cheaper at scale.">
<meta property="og:image" content="https://screentinker.com/assets/dashboard-preview.png">
<meta property="og:site_name" content="ScreenTinker">
<meta property="og:url" content="https://swiftdisplay.com/compare/screencloud-alternative.html">
<meta property="og:title" content="Best ScreenCloud Alternative (2026) | SwiftDisplay">
<meta property="og:description" content="SwiftDisplay vs ScreenCloud. Open source, self-hostable, dramatically cheaper at scale.">
<meta property="og:image" content="https://swiftdisplay.com/assets/dashboard-preview.png">
<meta property="og:site_name" content="SwiftDisplay">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Best ScreenCloud Alternative (2026)">
<meta name="twitter:description" content="ScreenTinker vs ScreenCloud. Open source, self-hostable, dramatically cheaper at scale.">
<meta name="twitter:image" content="https://screentinker.com/assets/dashboard-preview.png">
<meta name="twitter:description" content="SwiftDisplay vs ScreenCloud. Open source, self-hostable, dramatically cheaper at scale.">
<meta name="twitter:image" content="https://swiftdisplay.com/assets/dashboard-preview.png">
<meta name="theme-color" content="#111827">
<link rel="icon" href="/assets/icon-192.png">
@ -32,7 +32,7 @@
<div class="nav-logo">
<a href="/" style="display:flex;align-items:center;gap:10px">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="2" y="3" width="20" height="14" rx="2"/><line x1="8" y1="21" x2="16" y2="21"/><line x1="12" y1="17" x2="12" y2="21"/></svg>
<span class="nav-logo-text">ScreenTinker</span>
<span class="nav-logo-text">SwiftDisplay</span>
</a>
</div>
<div class="nav-links">
@ -55,18 +55,18 @@
<span>ScreenCloud Alternative</span>
</nav>
<h1>Best ScreenCloud Alternative (2026): ScreenTinker vs ScreenCloud</h1>
<h1>Best ScreenCloud Alternative (2026): SwiftDisplay vs ScreenCloud</h1>
<p class="lead">ScreenCloud is a polished enterprise digital signage platform - but pricing scales fast. Here is an honest comparison covering features, pricing, and where each fits best.</p>
<h2>The short answer</h2>
<p><strong>ScreenCloud</strong> is a mature, well-designed cloud signage product targeted at mid-market and enterprise customers. It has strong app integrations (Slack, Power BI, Google Drive) and excellent support. It is also one of the most expensive options on the market.</p>
<p><strong>ScreenTinker</strong> is open source (MIT licensed), self-hostable, and dramatically cheaper at scale. It is a better fit if you want to keep data on your own infrastructure, you have budget pressure, or your screen count makes ScreenCloud's per-screen pricing untenable.</p>
<p><strong>SwiftDisplay</strong> is open source (MIT licensed), self-hostable, and dramatically cheaper at scale. It is a better fit if you want to keep data on your own infrastructure, you have budget pressure, or your screen count makes ScreenCloud's per-screen pricing untenable.</p>
<h2>Quick comparison</h2>
<div class="compare-table-wrap">
<table class="compare-table">
<thead>
<tr><th>Feature</th><th>ScreenTinker</th><th>ScreenCloud</th></tr>
<tr><th>Feature</th><th>SwiftDisplay</th><th>ScreenCloud</th></tr>
</thead>
<tbody>
<tr><td>Open source</td><td class="yes">Yes (MIT)</td><td class="no">No</td></tr>
@ -88,7 +88,7 @@
</div>
<p style="font-size:12px;color:var(--dim);line-height:1.6;margin-top:12px">
* Live remote control is Android only and requires granting the on-device accessibility permission.<br>
Comparison as of June 2026, based on each vendor's publicly listed pricing and documentation. Spot an error? <a href="https://github.com/screentinker/screentinker/issues" target="_blank" rel="noopener">Open an issue on GitHub</a> and we'll fix it.
Comparison as of June 2026, based on each vendor's publicly listed pricing and documentation. Spot an error? <a href="https://github.com/swiftdisplay/swiftdisplay/issues" target="_blank" rel="noopener">Open an issue on GitHub</a> and we'll fix it.
</p>
<h2>Where ScreenCloud does well</h2>
@ -98,20 +98,20 @@
<li><strong>Studio (their content designer).</strong> Best-in-class WYSIWYG editor for non-designers.</li>
</ul>
<h2>Where ScreenTinker is the better choice</h2>
<h2>Where SwiftDisplay is the better choice</h2>
<ul>
<li><strong>Cost.</strong> At 15 screens ScreenCloud runs roughly $300/mo and up depending on plan; ScreenTinker Pro is $99/mo. Over a year that is more than $2,000 in savings on a single deployment.</li>
<li><strong>Self-hosting.</strong> ScreenCloud is cloud-only with no on-prem path. If your security team or compliance posture won't allow a third-party cloud, ScreenTinker is one of the few real options.</li>
<li><strong>Source access.</strong> MIT licensed on <a href="https://github.com/screentinker/screentinker" target="_blank" rel="noopener">GitHub</a>. Audit, extend, fork - all permitted.</li>
<li><strong>No hardware lock-in.</strong> ScreenCloud sells "ScreenCloud OS" hardware; ScreenTinker runs on whatever you have - Pi, Android TV, Fire Stick, kiosk PC, browser.</li>
<li><strong>Cost.</strong> At 15 screens ScreenCloud runs roughly $300/mo and up depending on plan; SwiftDisplay Pro is $99/mo. Over a year that is more than $2,000 in savings on a single deployment.</li>
<li><strong>Self-hosting.</strong> ScreenCloud is cloud-only with no on-prem path. If your security team or compliance posture won't allow a third-party cloud, SwiftDisplay is one of the few real options.</li>
<li><strong>Source access.</strong> MIT licensed on <a href="https://github.com/swiftdisplay/swiftdisplay" target="_blank" rel="noopener">GitHub</a>. Audit, extend, fork - all permitted.</li>
<li><strong>No hardware lock-in.</strong> ScreenCloud sells "ScreenCloud OS" hardware; SwiftDisplay runs on whatever you have - Pi, Android TV, Fire Stick, kiosk PC, browser.</li>
<li><strong>Live remote control.</strong> Stream a live view of any display and inject taps or key events from the dashboard. Useful for remote troubleshooting without a site visit.</li>
</ul>
<h2>Pricing example: 15 devices over 12 months</h2>
<ul>
<li><strong>ScreenCloud (Pro plan):</strong> ~$3,600/year</li>
<li><strong>ScreenTinker (Pro plan):</strong> $1,188/year</li>
<li><strong>ScreenTinker (self-hosted):</strong> Server cost only, typically $5-50/month for a small VPS</li>
<li><strong>SwiftDisplay (Pro plan):</strong> $1,188/year</li>
<li><strong>SwiftDisplay (self-hosted):</strong> Server cost only, typically $5-50/month for a small VPS</li>
</ul>
<div class="related">
@ -120,23 +120,23 @@
<li><a href="/guides/self-hosted-digital-signage.html">Self-hosted digital signage: complete guide</a></li>
<li><a href="/guides/raspberry-pi-digital-signage.html">How to set up digital signage on a Raspberry Pi</a></li>
<li><a href="/guides/digital-signage-android-tv.html">Free digital signage for Android TV and Fire TV</a></li>
<li><a href="/compare/yodeck-alternative.html">Compare: ScreenTinker vs Yodeck</a></li>
<li><a href="/compare/optisigns-alternative.html">Compare: ScreenTinker vs OptiSigns</a></li>
<li><a href="/compare/yodeck-alternative.html">Compare: SwiftDisplay vs Yodeck</a></li>
<li><a href="/compare/optisigns-alternative.html">Compare: SwiftDisplay vs OptiSigns</a></li>
</ul>
</div>
<div class="cta">
<h2>Try ScreenTinker free</h2>
<h2>Try SwiftDisplay free</h2>
<p>Start a 14-day Pro trial. No credit card required.</p>
<a href="/app#/login" class="btn btn-primary" style="padding:14px 28px;font-size:16px">Start Free Trial</a>
<a href="https://github.com/screentinker/screentinker" target="_blank" rel="noopener" class="btn btn-outline" style="padding:14px 28px;font-size:16px;margin-left:12px">View on GitHub</a>
<a href="https://github.com/swiftdisplay/swiftdisplay" target="_blank" rel="noopener" class="btn btn-outline" style="padding:14px 28px;font-size:16px;margin-left:12px">View on GitHub</a>
</div>
</main>
<footer>
<div style="color:var(--dim);font-size:13px">&copy; 2026 ScreenTinker. All rights reserved.</div>
<div style="color:var(--dim);font-size:13px">&copy; 2026 SwiftDisplay. All rights reserved.</div>
<div class="links">
<a href="https://github.com/screentinker/screentinker" target="_blank" rel="noopener">GitHub</a>
<a href="https://github.com/swiftdisplay/swiftdisplay" target="_blank" rel="noopener">GitHub</a>
<a href="https://discord.gg/utTdsrqq4Z" target="_blank" rel="noopener">Discord</a>
<a href="/legal/terms.html">Terms</a>
<a href="/legal/privacy.html">Privacy</a>
@ -150,9 +150,9 @@
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{ "@type": "ListItem", "position": 1, "name": "Home", "item": "https://screentinker.com/" },
{ "@type": "ListItem", "position": 2, "name": "Compare", "item": "https://screentinker.com/#compare" },
{ "@type": "ListItem", "position": 3, "name": "ScreenCloud Alternative", "item": "https://screentinker.com/compare/screencloud-alternative.html" }
{ "@type": "ListItem", "position": 1, "name": "Home", "item": "https://swiftdisplay.com/" },
{ "@type": "ListItem", "position": 2, "name": "Compare", "item": "https://swiftdisplay.com/#compare" },
{ "@type": "ListItem", "position": 3, "name": "ScreenCloud Alternative", "item": "https://swiftdisplay.com/compare/screencloud-alternative.html" }
]
}
</script>

View file

@ -3,23 +3,23 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Best Xibo Alternative (2026): ScreenTinker vs Xibo | ScreenTinker</title>
<meta name="description" content="Looking for a Xibo alternative? ScreenTinker is open source, MIT licensed, self-hostable, and every player (Android, Tizen, webOS, Fire TV, Pi, web) is free. Compare features, pricing, and platform support.">
<title>Best Xibo Alternative (2026): SwiftDisplay vs Xibo | SwiftDisplay</title>
<meta name="description" content="Looking for a Xibo alternative? SwiftDisplay is open source, MIT licensed, self-hostable, and every player (Android, Tizen, webOS, Fire TV, Pi, web) is free. Compare features, pricing, and platform support.">
<meta name="keywords" content="xibo alternative, free xibo alternative, open source digital signage, self hosted digital signage, digital signage cms">
<meta name="robots" content="index, follow">
<link rel="canonical" href="https://screentinker.com/compare/xibo-alternative.html">
<link rel="canonical" href="https://swiftdisplay.com/compare/xibo-alternative.html">
<meta property="og:type" content="article">
<meta property="og:url" content="https://screentinker.com/compare/xibo-alternative.html">
<meta property="og:title" content="Best Xibo Alternative (2026): ScreenTinker vs Xibo | ScreenTinker">
<meta property="og:description" content="ScreenTinker vs Xibo. Open source, self-hostable, and every player is free - no paid per-device licences.">
<meta property="og:image" content="https://screentinker.com/assets/dashboard-preview.png">
<meta property="og:site_name" content="ScreenTinker">
<meta property="og:url" content="https://swiftdisplay.com/compare/xibo-alternative.html">
<meta property="og:title" content="Best Xibo Alternative (2026): SwiftDisplay vs Xibo | SwiftDisplay">
<meta property="og:description" content="SwiftDisplay vs Xibo. Open source, self-hostable, and every player is free - no paid per-device licences.">
<meta property="og:image" content="https://swiftdisplay.com/assets/dashboard-preview.png">
<meta property="og:site_name" content="SwiftDisplay">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Best Xibo Alternative (2026): ScreenTinker vs Xibo">
<meta name="twitter:description" content="ScreenTinker vs Xibo. Open source, self-hostable, and every player is free - no paid per-device licences.">
<meta name="twitter:image" content="https://screentinker.com/assets/dashboard-preview.png">
<meta name="twitter:title" content="Best Xibo Alternative (2026): SwiftDisplay vs Xibo">
<meta name="twitter:description" content="SwiftDisplay vs Xibo. Open source, self-hostable, and every player is free - no paid per-device licences.">
<meta name="twitter:image" content="https://swiftdisplay.com/assets/dashboard-preview.png">
<meta name="theme-color" content="#111827">
<link rel="icon" href="/assets/icon-192.png">
@ -32,7 +32,7 @@
<div class="nav-logo">
<a href="/" style="display:flex;align-items:center;gap:10px">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="2" y="3" width="20" height="14" rx="2"/><line x1="8" y1="21" x2="16" y2="21"/><line x1="12" y1="17" x2="12" y2="21"/></svg>
<span class="nav-logo-text">ScreenTinker</span>
<span class="nav-logo-text">SwiftDisplay</span>
</a>
</div>
<div class="nav-links">
@ -55,18 +55,18 @@
<span>Xibo Alternative</span>
</nav>
<h1>Best Xibo Alternative (2026): ScreenTinker vs Xibo</h1>
<p class="lead">Xibo is one of the oldest open-source digital signage projects. But its open-source edition ships only a Windows player - the Android, Samsung Tizen, and LG webOS players you probably want cost money. Here is an honest comparison with ScreenTinker.</p>
<h1>Best Xibo Alternative (2026): SwiftDisplay vs Xibo</h1>
<p class="lead">Xibo is one of the oldest open-source digital signage projects. But its open-source edition ships only a Windows player - the Android, Samsung Tizen, and LG webOS players you probably want cost money. Here is an honest comparison with SwiftDisplay.</p>
<h2>The short answer</h2>
<p><strong>Xibo</strong> is a mature, well-documented signage platform that has been around since roughly 2010, with a strong community forum. Its CMS is open source under the AGPLv3 licence - but only the CMS and the Windows player are free. The Android, Tizen, and webOS players require paid perpetual per-device licences, and there is no free plan (the homepage funnels you into a 14-day trial and a paid cloud CMS).</p>
<p><strong>ScreenTinker</strong> is open source (MIT licensed), self-hostable, and <em>every</em> player is free - Android TV, Fire TV, Samsung Tizen, LG webOS, Amazon Vega OS, Raspberry Pi, and any web browser. No per-device player licence, and there is a genuine free plan. It is the better fit if you want the mainstream players without buying licences, or you want a straightforward MIT codebase you can fork.</p>
<p><strong>SwiftDisplay</strong> is open source (MIT licensed), self-hostable, and <em>every</em> player is free - Android TV, Fire TV, Samsung Tizen, LG webOS, Amazon Vega OS, Raspberry Pi, and any web browser. No per-device player licence, and there is a genuine free plan. It is the better fit if you want the mainstream players without buying licences, or you want a straightforward MIT codebase you can fork.</p>
<h2>Quick comparison</h2>
<div class="compare-table-wrap">
<table class="compare-table">
<thead>
<tr><th>Feature</th><th>ScreenTinker</th><th>Xibo</th></tr>
<tr><th>Feature</th><th>SwiftDisplay</th><th>Xibo</th></tr>
</thead>
<tbody>
<tr><td>Open source</td><td class="yes">Yes (MIT)</td><td class="yes">Yes (AGPLv3, CMS)</td></tr>
@ -90,7 +90,7 @@
</div>
<p style="font-size:12px;color:var(--dim);line-height:1.6;margin-top:12px">
* Live remote control is Android only and requires granting the on-device accessibility permission.<br>
Comparison as of July 2026, based on each vendor's publicly listed pricing and documentation. Spot an error? <a href="https://github.com/screentinker/screentinker/issues" target="_blank" rel="noopener">Open an issue on GitHub</a> and we'll fix it.
Comparison as of July 2026, based on each vendor's publicly listed pricing and documentation. Spot an error? <a href="https://github.com/swiftdisplay/swiftdisplay/issues" target="_blank" rel="noopener">Open an issue on GitHub</a> and we'll fix it.
</p>
<h2>Where Xibo does well</h2>
@ -100,23 +100,23 @@
<li><strong>Windows-first deployments.</strong> If your fleet is Windows players, the free Windows player plus the free AGPLv3 CMS is a genuinely capable open-source stack.</li>
</ul>
<h2>Where ScreenTinker is the better choice</h2>
<h2>Where SwiftDisplay is the better choice</h2>
<ul>
<li><strong>Every player is free.</strong> The players most people actually deploy - Android TV, Fire TV, Samsung Tizen, LG webOS - all cost money on Xibo as paid perpetual per-device licences. On ScreenTinker they are free, with no per-device player fee.</li>
<li><strong>There is a real free plan.</strong> Xibo funnels you into a 14-day trial and a paid cloud CMS. ScreenTinker has a genuine free tier (1 device, 500MB) and free unlimited self-hosting.</li>
<li><strong>Every player is free.</strong> The players most people actually deploy - Android TV, Fire TV, Samsung Tizen, LG webOS - all cost money on Xibo as paid perpetual per-device licences. On SwiftDisplay they are free, with no per-device player fee.</li>
<li><strong>There is a real free plan.</strong> Xibo funnels you into a 14-day trial and a paid cloud CMS. SwiftDisplay has a genuine free tier (1 device, 500MB) and free unlimited self-hosting.</li>
<li><strong>Broader player support out of the box.</strong> Amazon Vega OS, a first-class web player for any browser, and a free Raspberry Pi setup script - all included, no licence gate.</li>
<li><strong>Live remote control.</strong> ScreenTinker streams a live view of an Android display and forwards taps and key events back to the device.</li>
<li><strong>Simple MIT licence.</strong> ScreenTinker is MIT licensed on <a href="https://github.com/screentinker/screentinker" target="_blank" rel="noopener">GitHub</a> - audit it, extend it, or fork it without AGPL copyleft obligations.</li>
<li><strong>Live remote control.</strong> SwiftDisplay streams a live view of an Android display and forwards taps and key events back to the device.</li>
<li><strong>Simple MIT licence.</strong> SwiftDisplay is MIT licensed on <a href="https://github.com/swiftdisplay/swiftdisplay" target="_blank" rel="noopener">GitHub</a> - audit it, extend it, or fork it without AGPL copyleft obligations.</li>
</ul>
<h2>Pricing snapshot</h2>
<p>Xibo's CMS is free and open source, but the Android, Tizen, and webOS players carry <strong>paid perpetual per-device licences</strong>, and Xibo explicitly frames self-hosting as "typically a higher total cost of ownership than a plan" to steer you toward its paid cloud CMS. ScreenTinker charges nothing per player on any platform: the managed cloud is a flat <strong>$99/mo for 15 devices</strong> on Pro, and self-hosting is free and unlimited on a $5 VPS.</p>
<p>Xibo's CMS is free and open source, but the Android, Tizen, and webOS players carry <strong>paid perpetual per-device licences</strong>, and Xibo explicitly frames self-hosting as "typically a higher total cost of ownership than a plan" to steer you toward its paid cloud CMS. SwiftDisplay charges nothing per player on any platform: the managed cloud is a flat <strong>$99/mo for 15 devices</strong> on Pro, and self-hosting is free and unlimited on a $5 VPS.</p>
<div class="related">
<h2>Related guides</h2>
<ul>
<li><a href="/compare/anthias-alternative.html">Compare: ScreenTinker vs Anthias</a></li>
<li><a href="/compare/yodeck-alternative.html">Compare: ScreenTinker vs Yodeck</a></li>
<li><a href="/compare/anthias-alternative.html">Compare: SwiftDisplay vs Anthias</a></li>
<li><a href="/compare/yodeck-alternative.html">Compare: SwiftDisplay vs Yodeck</a></li>
<li><a href="/guides/self-hosted-digital-signage.html">Self-hosted digital signage: complete guide</a></li>
<li><a href="/guides/open-source-digital-signage.html">Open-source digital signage: complete guide</a></li>
<li><a href="/guides/raspberry-pi-digital-signage.html">How to set up digital signage on a Raspberry Pi</a></li>
@ -124,17 +124,17 @@
</div>
<div class="cta">
<h2>Try ScreenTinker free</h2>
<h2>Try SwiftDisplay free</h2>
<p>Start a 14-day Pro trial. No credit card required.</p>
<a href="/app#/login" class="btn btn-primary" style="padding:14px 28px;font-size:16px">Start Free Trial</a>
<a href="https://github.com/screentinker/screentinker" target="_blank" rel="noopener" class="btn btn-outline" style="padding:14px 28px;font-size:16px;margin-left:12px">View on GitHub</a>
<a href="https://github.com/swiftdisplay/swiftdisplay" target="_blank" rel="noopener" class="btn btn-outline" style="padding:14px 28px;font-size:16px;margin-left:12px">View on GitHub</a>
</div>
</main>
<footer>
<div style="color:var(--dim);font-size:13px">&copy; 2026 ScreenTinker. All rights reserved.</div>
<div style="color:var(--dim);font-size:13px">&copy; 2026 SwiftDisplay. All rights reserved.</div>
<div class="links">
<a href="https://github.com/screentinker/screentinker" target="_blank" rel="noopener">GitHub</a>
<a href="https://github.com/swiftdisplay/swiftdisplay" target="_blank" rel="noopener">GitHub</a>
<a href="https://discord.gg/utTdsrqq4Z" target="_blank" rel="noopener">Discord</a>
<a href="/legal/terms.html">Terms</a>
<a href="/legal/privacy.html">Privacy</a>
@ -148,9 +148,9 @@
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{ "@type": "ListItem", "position": 1, "name": "Home", "item": "https://screentinker.com/" },
{ "@type": "ListItem", "position": 2, "name": "Compare", "item": "https://screentinker.com/#compare" },
{ "@type": "ListItem", "position": 3, "name": "Xibo Alternative", "item": "https://screentinker.com/compare/xibo-alternative.html" }
{ "@type": "ListItem", "position": 1, "name": "Home", "item": "https://swiftdisplay.com/" },
{ "@type": "ListItem", "position": 2, "name": "Compare", "item": "https://swiftdisplay.com/#compare" },
{ "@type": "ListItem", "position": 3, "name": "Xibo Alternative", "item": "https://swiftdisplay.com/compare/xibo-alternative.html" }
]
}
</script>

View file

@ -3,23 +3,23 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Best Yodeck Alternative (2026) - Free & Open Source | ScreenTinker</title>
<meta name="description" content="Looking for a Yodeck alternative? ScreenTinker is open source, MIT licensed, self-hostable, and runs on any screen with no hardware lock-in. Free plan included. Compare features, pricing, and platform support.">
<title>Best Yodeck Alternative (2026) - Free & Open Source | SwiftDisplay</title>
<meta name="description" content="Looking for a Yodeck alternative? SwiftDisplay is open source, MIT licensed, self-hostable, and runs on any screen with no hardware lock-in. Free plan included. Compare features, pricing, and platform support.">
<meta name="keywords" content="yodeck alternative, free yodeck alternative, open source digital signage, self hosted digital signage, digital signage cms">
<meta name="robots" content="index, follow">
<link rel="canonical" href="https://screentinker.com/compare/yodeck-alternative.html">
<link rel="canonical" href="https://swiftdisplay.com/compare/yodeck-alternative.html">
<meta property="og:type" content="article">
<meta property="og:url" content="https://screentinker.com/compare/yodeck-alternative.html">
<meta property="og:title" content="Best Yodeck Alternative (2026) - Free & Open Source | ScreenTinker">
<meta property="og:description" content="ScreenTinker vs Yodeck. Open source, self-hostable, no hardware lock-in. Free plan included.">
<meta property="og:image" content="https://screentinker.com/assets/dashboard-preview.png">
<meta property="og:site_name" content="ScreenTinker">
<meta property="og:url" content="https://swiftdisplay.com/compare/yodeck-alternative.html">
<meta property="og:title" content="Best Yodeck Alternative (2026) - Free & Open Source | SwiftDisplay">
<meta property="og:description" content="SwiftDisplay vs Yodeck. Open source, self-hostable, no hardware lock-in. Free plan included.">
<meta property="og:image" content="https://swiftdisplay.com/assets/dashboard-preview.png">
<meta property="og:site_name" content="SwiftDisplay">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Best Yodeck Alternative (2026) - Free & Open Source">
<meta name="twitter:description" content="ScreenTinker vs Yodeck. Open source, self-hostable, no hardware lock-in. Free plan included.">
<meta name="twitter:image" content="https://screentinker.com/assets/dashboard-preview.png">
<meta name="twitter:description" content="SwiftDisplay vs Yodeck. Open source, self-hostable, no hardware lock-in. Free plan included.">
<meta name="twitter:image" content="https://swiftdisplay.com/assets/dashboard-preview.png">
<meta name="theme-color" content="#111827">
<link rel="icon" href="/assets/icon-192.png">
@ -32,7 +32,7 @@
<div class="nav-logo">
<a href="/" style="display:flex;align-items:center;gap:10px">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="2" y="3" width="20" height="14" rx="2"/><line x1="8" y1="21" x2="16" y2="21"/><line x1="12" y1="17" x2="12" y2="21"/></svg>
<span class="nav-logo-text">ScreenTinker</span>
<span class="nav-logo-text">SwiftDisplay</span>
</a>
</div>
<div class="nav-links">
@ -55,18 +55,18 @@
<span>Yodeck Alternative</span>
</nav>
<h1>Best Yodeck Alternative (2026): ScreenTinker vs Yodeck</h1>
<h1>Best Yodeck Alternative (2026): SwiftDisplay vs Yodeck</h1>
<p class="lead">Looking for an open-source, self-hostable alternative to Yodeck? Here is an honest comparison covering pricing, features, platform support, and where each tool fits best.</p>
<h2>The short answer</h2>
<p><strong>Yodeck</strong> is a polished, easy-to-use cloud digital signage product with a Pi player included on paid plans. It is a great fit if you want to plug in and go and you are happy with cloud-only hosting and per-screen pricing.</p>
<p><strong>ScreenTinker</strong> is open source (MIT licensed), self-hostable, and runs on any screen you already own with no hardware lock-in. It is a better fit if you want to keep your data on your own infrastructure, avoid per-screen lock-in, or you have more than a handful of screens and want to control the cost curve.</p>
<p><strong>SwiftDisplay</strong> is open source (MIT licensed), self-hostable, and runs on any screen you already own with no hardware lock-in. It is a better fit if you want to keep your data on your own infrastructure, avoid per-screen lock-in, or you have more than a handful of screens and want to control the cost curve.</p>
<h2>Quick comparison</h2>
<div class="compare-table-wrap">
<table class="compare-table">
<thead>
<tr><th>Feature</th><th>ScreenTinker</th><th>Yodeck</th></tr>
<tr><th>Feature</th><th>SwiftDisplay</th><th>Yodeck</th></tr>
</thead>
<tbody>
<tr><td>Open source</td><td class="yes">Yes (MIT)</td><td class="no">No</td></tr>
@ -88,7 +88,7 @@
</div>
<p style="font-size:12px;color:var(--dim);line-height:1.6;margin-top:12px">
* Live remote control is Android only and requires granting the on-device accessibility permission.<br>
Comparison as of June 2026, based on each vendor's publicly listed pricing and documentation. Spot an error? <a href="https://github.com/screentinker/screentinker/issues" target="_blank" rel="noopener">Open an issue on GitHub</a> and we'll fix it.
Comparison as of June 2026, based on each vendor's publicly listed pricing and documentation. Spot an error? <a href="https://github.com/swiftdisplay/swiftdisplay/issues" target="_blank" rel="noopener">Open an issue on GitHub</a> and we'll fix it.
</p>
<h2>Where Yodeck does well</h2>
@ -98,17 +98,17 @@
<li><strong>Templates.</strong> A large pre-built template library for menus, lobby boards, and announcements.</li>
</ul>
<h2>Where ScreenTinker is the better choice</h2>
<h2>Where SwiftDisplay is the better choice</h2>
<ul>
<li><strong>You need data sovereignty.</strong> If your content includes PII, internal documents, or you operate in regulated industries (healthcare, government, finance), self-hosting is the only way to keep data off a third-party cloud. Yodeck cannot do this.</li>
<li><strong>You have more than a handful of screens.</strong> Per-screen pricing scales linearly. ScreenTinker Pro is flat at $99/mo for 15 devices, and self-hosters pay nothing per device. At 50+ screens the total cost difference is significant.</li>
<li><strong>You want platform flexibility.</strong> ScreenTinker runs on any device with a browser - Smart TVs, ChromeOS, kiosk PCs, even old Macs. You are not locked into a specific Pi SKU.</li>
<li><strong>You want to read or modify the source.</strong> ScreenTinker is MIT licensed on <a href="https://github.com/screentinker/screentinker" target="_blank" rel="noopener">GitHub</a>. Audit the code, extend it, or fork it.</li>
<li><strong>You want live remote control.</strong> ScreenTinker streams a live screenshot feed and forwards touches and key events back to the device. Yodeck only takes occasional screenshots.</li>
<li><strong>You have more than a handful of screens.</strong> Per-screen pricing scales linearly. SwiftDisplay Pro is flat at $99/mo for 15 devices, and self-hosters pay nothing per device. At 50+ screens the total cost difference is significant.</li>
<li><strong>You want platform flexibility.</strong> SwiftDisplay runs on any device with a browser - Smart TVs, ChromeOS, kiosk PCs, even old Macs. You are not locked into a specific Pi SKU.</li>
<li><strong>You want to read or modify the source.</strong> SwiftDisplay is MIT licensed on <a href="https://github.com/swiftdisplay/swiftdisplay" target="_blank" rel="noopener">GitHub</a>. Audit the code, extend it, or fork it.</li>
<li><strong>You want live remote control.</strong> SwiftDisplay streams a live screenshot feed and forwards touches and key events back to the device. Yodeck only takes occasional screenshots.</li>
</ul>
<h2>Pricing snapshot</h2>
<p>Yodeck charges per screen per month, typically <strong>$8/screen/mo</strong> on the standard plan with annual billing. ScreenTinker Pro is a flat <strong>$99/mo for 15 devices</strong>. Crossover happens around 12-13 screens; above that ScreenTinker is meaningfully cheaper. Self-hosters pay nothing per device.</p>
<p>Yodeck charges per screen per month, typically <strong>$8/screen/mo</strong> on the standard plan with annual billing. SwiftDisplay Pro is a flat <strong>$99/mo for 15 devices</strong>. Crossover happens around 12-13 screens; above that SwiftDisplay is meaningfully cheaper. Self-hosters pay nothing per device.</p>
<div class="related">
<h2>Related guides</h2>
@ -116,23 +116,23 @@
<li><a href="/guides/raspberry-pi-digital-signage.html">How to set up digital signage on a Raspberry Pi</a></li>
<li><a href="/guides/digital-signage-android-tv.html">Free digital signage for Android TV and Fire TV</a></li>
<li><a href="/guides/self-hosted-digital-signage.html">Self-hosted digital signage: complete guide</a></li>
<li><a href="/compare/screencloud-alternative.html">Compare: ScreenTinker vs ScreenCloud</a></li>
<li><a href="/compare/optisigns-alternative.html">Compare: ScreenTinker vs OptiSigns</a></li>
<li><a href="/compare/screencloud-alternative.html">Compare: SwiftDisplay vs ScreenCloud</a></li>
<li><a href="/compare/optisigns-alternative.html">Compare: SwiftDisplay vs OptiSigns</a></li>
</ul>
</div>
<div class="cta">
<h2>Try ScreenTinker free</h2>
<h2>Try SwiftDisplay free</h2>
<p>Start a 14-day Pro trial. No credit card required.</p>
<a href="/app#/login" class="btn btn-primary" style="padding:14px 28px;font-size:16px">Start Free Trial</a>
<a href="https://github.com/screentinker/screentinker" target="_blank" rel="noopener" class="btn btn-outline" style="padding:14px 28px;font-size:16px;margin-left:12px">View on GitHub</a>
<a href="https://github.com/swiftdisplay/swiftdisplay" target="_blank" rel="noopener" class="btn btn-outline" style="padding:14px 28px;font-size:16px;margin-left:12px">View on GitHub</a>
</div>
</main>
<footer>
<div style="color:var(--dim);font-size:13px">&copy; 2026 ScreenTinker. All rights reserved.</div>
<div style="color:var(--dim);font-size:13px">&copy; 2026 SwiftDisplay. All rights reserved.</div>
<div class="links">
<a href="https://github.com/screentinker/screentinker" target="_blank" rel="noopener">GitHub</a>
<a href="https://github.com/swiftdisplay/swiftdisplay" target="_blank" rel="noopener">GitHub</a>
<a href="https://discord.gg/utTdsrqq4Z" target="_blank" rel="noopener">Discord</a>
<a href="/legal/terms.html">Terms</a>
<a href="/legal/privacy.html">Privacy</a>
@ -146,9 +146,9 @@
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{ "@type": "ListItem", "position": 1, "name": "Home", "item": "https://screentinker.com/" },
{ "@type": "ListItem", "position": 2, "name": "Compare", "item": "https://screentinker.com/#compare" },
{ "@type": "ListItem", "position": 3, "name": "Yodeck Alternative", "item": "https://screentinker.com/compare/yodeck-alternative.html" }
{ "@type": "ListItem", "position": 1, "name": "Home", "item": "https://swiftdisplay.com/" },
{ "@type": "ListItem", "position": 2, "name": "Compare", "item": "https://swiftdisplay.com/#compare" },
{ "@type": "ListItem", "position": 3, "name": "Yodeck Alternative", "item": "https://swiftdisplay.com/compare/yodeck-alternative.html" }
]
}
</script>

View file

@ -3,23 +3,23 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Free Digital Signage for Android TV & Fire TV (2026) | ScreenTinker</title>
<meta name="description" content="Turn any Android TV box or Amazon Fire Stick into a digital signage display with ScreenTinker. Free APK, kiosk mode, remote control. Step-by-step guide for 2026.">
<title>Free Digital Signage for Android TV & Fire TV (2026) | SwiftDisplay</title>
<meta name="description" content="Turn any Android TV box or Amazon Fire Stick into a digital signage display with SwiftDisplay. Free APK, kiosk mode, remote control. Step-by-step guide for 2026.">
<meta name="keywords" content="digital signage android tv, fire tv signage, android tv kiosk, fire stick digital signage, free android tv signage, open source android tv signage">
<meta name="robots" content="index, follow">
<link rel="canonical" href="https://screentinker.com/guides/digital-signage-android-tv.html">
<link rel="canonical" href="https://swiftdisplay.com/guides/digital-signage-android-tv.html">
<meta property="og:type" content="article">
<meta property="og:url" content="https://screentinker.com/guides/digital-signage-android-tv.html">
<meta property="og:url" content="https://swiftdisplay.com/guides/digital-signage-android-tv.html">
<meta property="og:title" content="Free Digital Signage for Android TV & Fire TV (2026)">
<meta property="og:description" content="Turn any Android TV or Fire Stick into a digital signage player. Free APK, kiosk mode, remote control.">
<meta property="og:image" content="https://screentinker.com/assets/dashboard-preview.png">
<meta property="og:site_name" content="ScreenTinker">
<meta property="og:image" content="https://swiftdisplay.com/assets/dashboard-preview.png">
<meta property="og:site_name" content="SwiftDisplay">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Free Digital Signage for Android TV & Fire TV (2026)">
<meta name="twitter:description" content="Turn any Android TV or Fire Stick into a digital signage player. Free APK, kiosk mode, remote control.">
<meta name="twitter:image" content="https://screentinker.com/assets/dashboard-preview.png">
<meta name="twitter:image" content="https://swiftdisplay.com/assets/dashboard-preview.png">
<meta name="theme-color" content="#111827">
<link rel="icon" href="/assets/icon-192.png">
@ -32,7 +32,7 @@
<div class="nav-logo">
<a href="/" style="display:flex;align-items:center;gap:10px">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="2" y="3" width="20" height="14" rx="2"/><line x1="8" y1="21" x2="16" y2="21"/><line x1="12" y1="17" x2="12" y2="21"/></svg>
<span class="nav-logo-text">ScreenTinker</span>
<span class="nav-logo-text">SwiftDisplay</span>
</a>
</div>
<div class="nav-links">
@ -56,7 +56,7 @@
</nav>
<h1>Free Digital Signage for Android TV and Fire TV (2026)</h1>
<p class="lead">Turn any Android TV box, Apolosign player, or Amazon Fire Stick into a fully managed digital signage display using the free ScreenTinker APK.</p>
<p class="lead">Turn any Android TV box, Apolosign player, or Amazon Fire Stick into a fully managed digital signage display using the free SwiftDisplay APK.</p>
<h2>What works</h2>
<ul>
@ -67,29 +67,29 @@
</ul>
<h2>Step 1: Get the APK</h2>
<p>Download the ScreenTinker APK from <a href="/download/apk">screentinker.com/download/apk</a>. The latest signed release is hosted directly so you do not need a Play Store or App Store account.</p>
<p>Download the SwiftDisplay APK from <a href="/download/apk">swiftdisplay.com/download/apk</a>. The latest signed release is hosted directly so you do not need a Play Store or App Store account.</p>
<h2>Step 2: Sideload onto the device</h2>
<h3>On Android TV</h3>
<p>The easiest path is to install the <strong>Downloader</strong> app from the Google Play Store on the TV, then enter the URL <code>https://screentinker.com/download/apk</code>. Downloader fetches the APK and walks you through installing it. You will be prompted once to "allow installs from this source" - say yes.</p>
<p>The easiest path is to install the <strong>Downloader</strong> app from the Google Play Store on the TV, then enter the URL <code>https://swiftdisplay.com/download/apk</code>. Downloader fetches the APK and walks you through installing it. You will be prompted once to "allow installs from this source" - say yes.</p>
<h3>On Fire TV / Fire Stick</h3>
<p>Install <strong>Downloader</strong> from the Amazon App Store. In Settings &gt; My Fire TV &gt; Developer Options, enable <strong>Apps from Unknown Sources</strong>. Open Downloader, enter <code>https://screentinker.com/download/apk</code>, and install.</p>
<p>Install <strong>Downloader</strong> from the Amazon App Store. In Settings &gt; My Fire TV &gt; Developer Options, enable <strong>Apps from Unknown Sources</strong>. Open Downloader, enter <code>https://swiftdisplay.com/download/apk</code>, and install.</p>
<h3>On Apolosign / commercial Android signage hardware</h3>
<p>These devices typically expose a system file manager. Plug in a USB drive containing the APK, open the file manager, and tap the APK to install. Some Apolosign units allow direct URL install via the built-in browser.</p>
<h2>Step 3: Pair the device</h2>
<p>Launch the ScreenTinker app. The first time it runs, you will be asked to grant a few permissions:</p>
<p>Launch the SwiftDisplay app. The first time it runs, you will be asked to grant a few permissions:</p>
<ul>
<li><strong>Display over other apps</strong> - so the player can stay fullscreen</li>
<li><strong>Storage</strong> - for the local content cache</li>
<li><strong>Accessibility service</strong> (optional) - enables remote touch and key injection from the dashboard</li>
</ul>
<p>The app will then show a 6-digit pairing code. Sign in to your <a href="/app#/login">ScreenTinker dashboard</a>, click <strong>+ Add Display</strong>, and enter the code.</p>
<p>The app will then show a 6-digit pairing code. Sign in to your <a href="/app#/login">SwiftDisplay dashboard</a>, click <strong>+ Add Display</strong>, and enter the code.</p>
<h2>Step 4: Push content</h2>
<p>Same as any other ScreenTinker display:</p>
<p>Same as any other SwiftDisplay display:</p>
<ol>
<li>Upload media in the <strong>Content Library</strong></li>
<li>Build a <strong>Playlist</strong></li>
@ -99,7 +99,7 @@
<h2>Kiosk mode tips</h2>
<p>For unattended displays you generally want the device to boot straight into the player with no way for someone to back out:</p>
<ul>
<li><strong>Set ScreenTinker as the launcher.</strong> The APK declares <code>HOME</code> intent support, so on most Android TVs you can pick it as the default launcher in Settings &gt; Apps.</li>
<li><strong>Set SwiftDisplay as the launcher.</strong> The APK declares <code>HOME</code> intent support, so on most Android TVs you can pick it as the default launcher in Settings &gt; Apps.</li>
<li><strong>Disable updates and notifications</strong> on the device to prevent unwanted popups.</li>
<li><strong>Enable auto-power-on</strong> in TV settings if you want the display to come back after a power blip without manual intervention.</li>
<li><strong>For Fire Stick,</strong> use the Wolf Launcher or similar to replace the Amazon home screen.</li>
@ -118,8 +118,8 @@
<ul>
<li><a href="/guides/raspberry-pi-digital-signage.html">How to set up digital signage on a Raspberry Pi</a></li>
<li><a href="/guides/self-hosted-digital-signage.html">Self-hosted digital signage: complete guide</a></li>
<li><a href="/compare/yodeck-alternative.html">Compare: ScreenTinker vs Yodeck</a></li>
<li><a href="/compare/screencloud-alternative.html">Compare: ScreenTinker vs ScreenCloud</a></li>
<li><a href="/compare/yodeck-alternative.html">Compare: SwiftDisplay vs Yodeck</a></li>
<li><a href="/compare/screencloud-alternative.html">Compare: SwiftDisplay vs ScreenCloud</a></li>
</ul>
</div>
@ -132,9 +132,9 @@
</main>
<footer>
<div style="color:var(--dim);font-size:13px">&copy; 2026 ScreenTinker. All rights reserved.</div>
<div style="color:var(--dim);font-size:13px">&copy; 2026 SwiftDisplay. All rights reserved.</div>
<div class="links">
<a href="https://github.com/screentinker/screentinker" target="_blank" rel="noopener">GitHub</a>
<a href="https://github.com/swiftdisplay/swiftdisplay" target="_blank" rel="noopener">GitHub</a>
<a href="https://discord.gg/utTdsrqq4Z" target="_blank" rel="noopener">Discord</a>
<a href="/legal/terms.html">Terms</a>
<a href="/legal/privacy.html">Privacy</a>
@ -148,9 +148,9 @@
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{ "@type": "ListItem", "position": 1, "name": "Home", "item": "https://screentinker.com/" },
{ "@type": "ListItem", "position": 2, "name": "Guides", "item": "https://screentinker.com/" },
{ "@type": "ListItem", "position": 3, "name": "Android TV and Fire TV Signage", "item": "https://screentinker.com/guides/digital-signage-android-tv.html" }
{ "@type": "ListItem", "position": 1, "name": "Home", "item": "https://swiftdisplay.com/" },
{ "@type": "ListItem", "position": 2, "name": "Guides", "item": "https://swiftdisplay.com/" },
{ "@type": "ListItem", "position": 3, "name": "Android TV and Fire TV Signage", "item": "https://swiftdisplay.com/guides/digital-signage-android-tv.html" }
]
}
</script>

View file

@ -3,23 +3,23 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Open Source Digital Signage Software - Free & Self-Hosted (2026) | ScreenTinker</title>
<meta name="description" content="A guide to open source digital signage software. Own your data, pay no per-screen fees, and self-host or use the cloud. ScreenTinker is a free, MIT-licensed digital signage CMS.">
<title>Open Source Digital Signage Software - Free & Self-Hosted (2026) | SwiftDisplay</title>
<meta name="description" content="A guide to open source digital signage software. Own your data, pay no per-screen fees, and self-host or use the cloud. SwiftDisplay is a free, MIT-licensed digital signage CMS.">
<meta name="keywords" content="open source digital signage, open source digital signage software, open source digital signage cms, free digital signage software, self hosted digital signage, mit licensed signage">
<meta name="robots" content="index, follow">
<link rel="canonical" href="https://screentinker.com/guides/open-source-digital-signage.html">
<link rel="canonical" href="https://swiftdisplay.com/guides/open-source-digital-signage.html">
<meta property="og:type" content="article">
<meta property="og:url" content="https://screentinker.com/guides/open-source-digital-signage.html">
<meta property="og:url" content="https://swiftdisplay.com/guides/open-source-digital-signage.html">
<meta property="og:title" content="Open Source Digital Signage Software - Free & Self-Hosted (2026)">
<meta property="og:description" content="Own your data, pay no per-screen fees, self-host or use the cloud. ScreenTinker is a free, MIT-licensed digital signage CMS.">
<meta property="og:image" content="https://screentinker.com/assets/dashboard-preview.png">
<meta property="og:site_name" content="ScreenTinker">
<meta property="og:description" content="Own your data, pay no per-screen fees, self-host or use the cloud. SwiftDisplay is a free, MIT-licensed digital signage CMS.">
<meta property="og:image" content="https://swiftdisplay.com/assets/dashboard-preview.png">
<meta property="og:site_name" content="SwiftDisplay">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Open Source Digital Signage Software - Free & Self-Hosted (2026)">
<meta name="twitter:description" content="Own your data, pay no per-screen fees, self-host or use the cloud. ScreenTinker is a free, MIT-licensed digital signage CMS.">
<meta name="twitter:image" content="https://screentinker.com/assets/dashboard-preview.png">
<meta name="twitter:description" content="Own your data, pay no per-screen fees, self-host or use the cloud. SwiftDisplay is a free, MIT-licensed digital signage CMS.">
<meta name="twitter:image" content="https://swiftdisplay.com/assets/dashboard-preview.png">
<meta name="theme-color" content="#111827">
<link rel="icon" href="/assets/icon-192.png">
@ -32,7 +32,7 @@
<div class="nav-logo">
<a href="/" style="display:flex;align-items:center;gap:10px">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="2" y="3" width="20" height="14" rx="2"/><line x1="8" y1="21" x2="16" y2="21"/><line x1="12" y1="17" x2="12" y2="21"/></svg>
<span class="nav-logo-text">ScreenTinker</span>
<span class="nav-logo-text">SwiftDisplay</span>
</a>
</div>
<div class="nav-links">
@ -56,23 +56,23 @@
</nav>
<h1>Open Source Digital Signage Software: Free & Self-Hosted (2026)</h1>
<p class="lead">Open source digital signage lets you own your content, skip per-screen subscription fees, and run your screens on your own terms. Here is what it means, why it matters, and how ScreenTinker fits in.</p>
<p class="lead">Open source digital signage lets you own your content, skip per-screen subscription fees, and run your screens on your own terms. Here is what it means, why it matters, and how SwiftDisplay fits in.</p>
<h2>What is open-source digital signage?</h2>
<p>Open-source digital signage is signage software whose source code is publicly available under a permissive license, so anyone can inspect, run, modify, and redistribute it. Instead of renting access to a closed cloud platform, you get the actual application - the content management system (CMS) that schedules and pushes content, plus the players that run on your screens.</p>
<p>ScreenTinker is an open-source digital signage CMS released under the <strong>MIT license</strong>. That license is about as permissive as it gets: you can audit the code, fork it, extend it, and deploy it commercially with no strings attached. You can run it as a managed cloud service or self-host it on a server you control - the same codebase either way.</p>
<p>SwiftDisplay is an open-source digital signage CMS released under the <strong>MIT license</strong>. That license is about as permissive as it gets: you can audit the code, fork it, extend it, and deploy it commercially with no strings attached. You can run it as a managed cloud service or self-host it on a server you control - the same codebase either way.</p>
<h2>Why choose open source over cloud SaaS?</h2>
<ul>
<li><strong>Data ownership.</strong> With a self-hosted open-source deployment, your content, schedules, device list, and logs live on infrastructure you control - not in a vendor's cloud. For healthcare, finance, government, and education, that is often a hard requirement.</li>
<li><strong>No per-screen fees.</strong> Closed SaaS products charge a recurring fee for every screen, typically $5-15/screen/month. Self-hosting ScreenTinker replaces that with a flat server cost - a $5 VPS can run hundreds of screens.</li>
<li><strong>No per-screen fees.</strong> Closed SaaS products charge a recurring fee for every screen, typically $5-15/screen/month. Self-hosting SwiftDisplay replaces that with a flat server cost - a $5 VPS can run hundreds of screens.</li>
<li><strong>No vendor lock-in.</strong> If a cloud vendor raises prices, pivots, or shuts down, your deployment goes with it. With MIT-licensed source you own your copy and control your own roadmap.</li>
<li><strong>Auditable and MIT-licensed.</strong> You can read every line, run a security review, and satisfy procurement teams that need to know exactly what runs on the network.</li>
<li><strong>Self-host or cloud.</strong> Open source does not force you onto your own servers. Start on the hosted free plan to evaluate, then self-host when you are ready - or stay on the cloud if you prefer managed hosting.</li>
</ul>
<h2>What ScreenTinker gives you</h2>
<p>ScreenTinker is a full digital signage platform, not just a media player. Everything below is in the open-source project:</p>
<h2>What SwiftDisplay gives you</h2>
<p>SwiftDisplay is a full digital signage platform, not just a media player. Everything below is in the open-source project:</p>
<ul>
<li><strong>Content and scheduling:</strong> playlists, scheduling and dayparting, content expiry, and multi-zone layouts.</li>
<li><strong>Multi-screen:</strong> video walls with multi-screen sync, group sync, kiosk mode, and offline-native playback that keeps running when the network drops.</li>
@ -87,7 +87,7 @@
<div class="compare-table-wrap">
<table class="compare-table">
<thead>
<tr><th>Concern</th><th>ScreenTinker (open source)</th><th>Cloud SaaS (Yodeck / ScreenCloud / OptiSigns)</th></tr>
<tr><th>Concern</th><th>SwiftDisplay (open source)</th><th>Cloud SaaS (Yodeck / ScreenCloud / OptiSigns)</th></tr>
</thead>
<tbody>
<tr><td>License / source access</td><td class="yes">Open source (MIT)</td><td class="no">Closed / proprietary</td></tr>
@ -103,34 +103,34 @@
</table>
</div>
<h2>How ScreenTinker compares to other open-source options</h2>
<p>ScreenTinker is not the only open-source signage project - the two best-known alternatives are Xibo and Anthias (formerly Screenly OSE).</p>
<p><strong>vs Xibo:</strong> Xibo is open source on the server side, but its player apps are not all free - the Android, Tizen, and webOS players are paid licenses. With ScreenTinker every player is free on every platform. See the <a href="/compare/xibo-alternative.html">ScreenTinker vs Xibo comparison</a>.</p>
<p><strong>vs Anthias:</strong> Anthias is a lightweight single-screen player built for one Raspberry Pi at a time, without a true multi-device fleet CMS. ScreenTinker is a modern multi-device platform - manage Android TV, Fire TV, Tizen, webOS, Vega, Pi, and browsers from one dashboard. See the <a href="/compare/anthias-alternative.html">ScreenTinker vs Anthias comparison</a>.</p>
<h2>How SwiftDisplay compares to other open-source options</h2>
<p>SwiftDisplay is not the only open-source signage project - the two best-known alternatives are Xibo and Anthias (formerly Screenly OSE).</p>
<p><strong>vs Xibo:</strong> Xibo is open source on the server side, but its player apps are not all free - the Android, Tizen, and webOS players are paid licenses. With SwiftDisplay every player is free on every platform. See the <a href="/compare/xibo-alternative.html">SwiftDisplay vs Xibo comparison</a>.</p>
<p><strong>vs Anthias:</strong> Anthias is a lightweight single-screen player built for one Raspberry Pi at a time, without a true multi-device fleet CMS. SwiftDisplay is a modern multi-device platform - manage Android TV, Fire TV, Tizen, webOS, Vega, Pi, and browsers from one dashboard. See the <a href="/compare/anthias-alternative.html">SwiftDisplay vs Anthias comparison</a>.</p>
<h2>Getting started</h2>
<p>The fastest path is the hosted free plan - one device, no server to run. When you are ready to self-host, clone the repo:</p>
<pre><code>git clone https://github.com/screentinker/screentinker.git
cd screentinker/server
<pre><code>git clone https://github.com/swiftdisplay/swiftdisplay.git
cd swiftdisplay/server
npm install
cp .env.example .env
# edit .env with your domain, JWT_SECRET, and SELF_HOSTED=true
node server.js</code></pre>
<p>ScreenTinker runs on Node.js with a SQLite database, so a $5 VPS is enough to manage hundreds of screens. Full deployment details are in the <a href="https://github.com/screentinker/screentinker" target="_blank" rel="noopener">GitHub README</a>, and the <a href="/guides/self-hosted-digital-signage.html">self-hosted guide</a> walks through reverse proxy, TLS, and backups.</p>
<p>SwiftDisplay runs on Node.js with a SQLite database, so a $5 VPS is enough to manage hundreds of screens. Full deployment details are in the <a href="https://github.com/swiftdisplay/swiftdisplay" target="_blank" rel="noopener">GitHub README</a>, and the <a href="/guides/self-hosted-digital-signage.html">self-hosted guide</a> walks through reverse proxy, TLS, and backups.</p>
<h2>Frequently asked questions</h2>
<h3>Is ScreenTinker really free and open source?</h3>
<p>Yes. ScreenTinker is released under the MIT license, so the full source code is public and you can audit, fork, and extend it. Self-hosting is free with unlimited devices; the managed cloud has a free plan plus paid tiers if you prefer hosted convenience.</p>
<h3>Is SwiftDisplay really free and open source?</h3>
<p>Yes. SwiftDisplay is released under the MIT license, so the full source code is public and you can audit, fork, and extend it. Self-hosting is free with unlimited devices; the managed cloud has a free plan plus paid tiers if you prefer hosted convenience.</p>
<h3>What does the MIT license let me do?</h3>
<p>The MIT license lets you run, modify, and redistribute the software - including commercially - with essentially no restrictions beyond keeping the copyright notice. You can build custom widgets, integrate it into your own systems, and white-label it.</p>
<h3>Do I have to self-host to use open-source digital signage?</h3>
<p>No. Open source means the code is available if you want it, but you can still use ScreenTinker's managed cloud. Many teams start on the hosted free plan and self-host later once their screen count grows.</p>
<p>No. Open source means the code is available if you want it, but you can still use SwiftDisplay's managed cloud. Many teams start on the hosted free plan and self-host later once their screen count grows.</p>
<h3>Are all the player apps free?</h3>
<p>Yes. Android TV / Fire TV, Samsung Tizen, LG webOS, Amazon Vega OS, Raspberry Pi, and the browser-based web player are all free on every platform, with no per-player license.</p>
<h3>How is ScreenTinker different from Xibo?</h3>
<p>Both are open source on the server, but Xibo charges license fees for its Android, Tizen, and webOS players. ScreenTinker keeps every player free on every platform.</p>
<h3>How is SwiftDisplay different from Xibo?</h3>
<p>Both are open source on the server, but Xibo charges license fees for its Android, Tizen, and webOS players. SwiftDisplay keeps every player free on every platform.</p>
<h3>How many screens can a self-hosted server handle?</h3>
<p>ScreenTinker runs on Node.js and SQLite, which is efficient. A small $5/month VPS can comfortably manage hundreds of screens; larger fleets just need a bit more CPU, RAM, and storage.</p>
<p>SwiftDisplay runs on Node.js and SQLite, which is efficient. A small $5/month VPS can comfortably manage hundreds of screens; larger fleets just need a bit more CPU, RAM, and storage.</p>
<div class="related">
<h2>Related guides</h2>
@ -138,9 +138,9 @@ node server.js</code></pre>
<li><a href="/guides/what-is-digital-signage.html">What is digital signage? A complete guide</a></li>
<li><a href="/guides/self-hosted-digital-signage.html">Self-hosted digital signage: complete guide</a></li>
<li><a href="/guides/raspberry-pi-digital-signage.html">How to set up digital signage on a Raspberry Pi</a></li>
<li><a href="/compare/xibo-alternative.html">Compare: ScreenTinker vs Xibo</a></li>
<li><a href="/compare/anthias-alternative.html">Compare: ScreenTinker vs Anthias</a></li>
<li><a href="/compare/yodeck-alternative.html">Compare: ScreenTinker vs Yodeck</a></li>
<li><a href="/compare/xibo-alternative.html">Compare: SwiftDisplay vs Xibo</a></li>
<li><a href="/compare/anthias-alternative.html">Compare: SwiftDisplay vs Anthias</a></li>
<li><a href="/compare/yodeck-alternative.html">Compare: SwiftDisplay vs Yodeck</a></li>
</ul>
</div>
@ -148,14 +148,14 @@ node server.js</code></pre>
<h2>Start with open-source signage</h2>
<p>Try the hosted free plan in under a minute, or clone the repo and self-host today.</p>
<a href="/app#/login" class="btn btn-primary" style="padding:14px 28px;font-size:16px">Start Free</a>
<a href="https://github.com/screentinker/screentinker" target="_blank" rel="noopener" class="btn btn-outline" style="padding:14px 28px;font-size:16px;margin-left:12px">View on GitHub</a>
<a href="https://github.com/swiftdisplay/swiftdisplay" target="_blank" rel="noopener" class="btn btn-outline" style="padding:14px 28px;font-size:16px;margin-left:12px">View on GitHub</a>
</div>
</main>
<footer>
<div style="color:var(--dim);font-size:13px">&copy; 2026 ScreenTinker. All rights reserved.</div>
<div style="color:var(--dim);font-size:13px">&copy; 2026 SwiftDisplay. All rights reserved.</div>
<div class="links">
<a href="https://github.com/screentinker/screentinker" target="_blank" rel="noopener">GitHub</a>
<a href="https://github.com/swiftdisplay/swiftdisplay" target="_blank" rel="noopener">GitHub</a>
<a href="https://discord.gg/utTdsrqq4Z" target="_blank" rel="noopener">Discord</a>
<a href="/legal/terms.html">Terms</a>
<a href="/legal/privacy.html">Privacy</a>
@ -169,9 +169,9 @@ node server.js</code></pre>
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{ "@type": "ListItem", "position": 1, "name": "Home", "item": "https://screentinker.com/" },
{ "@type": "ListItem", "position": 2, "name": "Guides", "item": "https://screentinker.com/" },
{ "@type": "ListItem", "position": 3, "name": "Open Source Digital Signage", "item": "https://screentinker.com/guides/open-source-digital-signage.html" }
{ "@type": "ListItem", "position": 1, "name": "Home", "item": "https://swiftdisplay.com/" },
{ "@type": "ListItem", "position": 2, "name": "Guides", "item": "https://swiftdisplay.com/" },
{ "@type": "ListItem", "position": 3, "name": "Open Source Digital Signage", "item": "https://swiftdisplay.com/guides/open-source-digital-signage.html" }
]
}
</script>
@ -182,8 +182,8 @@ node server.js</code></pre>
"mainEntity": [
{
"@type": "Question",
"name": "Is ScreenTinker really free and open source?",
"acceptedAnswer": { "@type": "Answer", "text": "Yes. ScreenTinker is released under the MIT license, so the full source code is public and you can audit, fork, and extend it. Self-hosting is free with unlimited devices; the managed cloud has a free plan plus paid tiers if you prefer hosted convenience." }
"name": "Is SwiftDisplay really free and open source?",
"acceptedAnswer": { "@type": "Answer", "text": "Yes. SwiftDisplay is released under the MIT license, so the full source code is public and you can audit, fork, and extend it. Self-hosting is free with unlimited devices; the managed cloud has a free plan plus paid tiers if you prefer hosted convenience." }
},
{
"@type": "Question",
@ -193,7 +193,7 @@ node server.js</code></pre>
{
"@type": "Question",
"name": "Do I have to self-host to use open-source digital signage?",
"acceptedAnswer": { "@type": "Answer", "text": "No. Open source means the code is available if you want it, but you can still use ScreenTinker's managed cloud. Many teams start on the hosted free plan and self-host later once their screen count grows." }
"acceptedAnswer": { "@type": "Answer", "text": "No. Open source means the code is available if you want it, but you can still use SwiftDisplay's managed cloud. Many teams start on the hosted free plan and self-host later once their screen count grows." }
},
{
"@type": "Question",
@ -202,13 +202,13 @@ node server.js</code></pre>
},
{
"@type": "Question",
"name": "How is ScreenTinker different from Xibo?",
"acceptedAnswer": { "@type": "Answer", "text": "Both are open source on the server, but Xibo charges license fees for its Android, Tizen, and webOS players. ScreenTinker keeps every player free on every platform." }
"name": "How is SwiftDisplay different from Xibo?",
"acceptedAnswer": { "@type": "Answer", "text": "Both are open source on the server, but Xibo charges license fees for its Android, Tizen, and webOS players. SwiftDisplay keeps every player free on every platform." }
},
{
"@type": "Question",
"name": "How many screens can a self-hosted server handle?",
"acceptedAnswer": { "@type": "Answer", "text": "ScreenTinker runs on Node.js and SQLite, which is efficient. A small $5/month VPS can comfortably manage hundreds of screens; larger fleets just need a bit more CPU, RAM, and storage." }
"acceptedAnswer": { "@type": "Answer", "text": "SwiftDisplay runs on Node.js and SQLite, which is efficient. A small $5/month VPS can comfortably manage hundreds of screens; larger fleets just need a bit more CPU, RAM, and storage." }
}
]
}

View file

@ -3,23 +3,23 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>How to Set Up Digital Signage on Raspberry Pi (2026) | ScreenTinker</title>
<meta name="description" content="Step-by-step guide to building a Raspberry Pi digital signage player with ScreenTinker. Covers hardware, Pi OS setup, the install script, pairing, and pushing content. Free and open source.">
<title>How to Set Up Digital Signage on Raspberry Pi (2026) | SwiftDisplay</title>
<meta name="description" content="Step-by-step guide to building a Raspberry Pi digital signage player with SwiftDisplay. Covers hardware, Pi OS setup, the install script, pairing, and pushing content. Free and open source.">
<meta name="keywords" content="raspberry pi digital signage, digital signage raspberry pi, pi signage, raspberry pi tv display, free pi signage software, open source pi signage">
<meta name="robots" content="index, follow">
<link rel="canonical" href="https://screentinker.com/guides/raspberry-pi-digital-signage.html">
<link rel="canonical" href="https://swiftdisplay.com/guides/raspberry-pi-digital-signage.html">
<meta property="og:type" content="article">
<meta property="og:url" content="https://screentinker.com/guides/raspberry-pi-digital-signage.html">
<meta property="og:url" content="https://swiftdisplay.com/guides/raspberry-pi-digital-signage.html">
<meta property="og:title" content="How to Set Up Digital Signage on Raspberry Pi (2026)">
<meta property="og:description" content="Step-by-step Pi signage guide. Hardware, OS, install script, pairing, content. Free and open source.">
<meta property="og:image" content="https://screentinker.com/assets/dashboard-preview.png">
<meta property="og:site_name" content="ScreenTinker">
<meta property="og:image" content="https://swiftdisplay.com/assets/dashboard-preview.png">
<meta property="og:site_name" content="SwiftDisplay">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="How to Set Up Digital Signage on Raspberry Pi (2026)">
<meta name="twitter:description" content="Step-by-step Pi signage guide. Hardware, OS, install script, pairing, content. Free and open source.">
<meta name="twitter:image" content="https://screentinker.com/assets/dashboard-preview.png">
<meta name="twitter:image" content="https://swiftdisplay.com/assets/dashboard-preview.png">
<meta name="theme-color" content="#111827">
<link rel="icon" href="/assets/icon-192.png">
@ -32,7 +32,7 @@
<div class="nav-logo">
<a href="/" style="display:flex;align-items:center;gap:10px">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="2" y="3" width="20" height="14" rx="2"/><line x1="8" y1="21" x2="16" y2="21"/><line x1="12" y1="17" x2="12" y2="21"/></svg>
<span class="nav-logo-text">ScreenTinker</span>
<span class="nav-logo-text">SwiftDisplay</span>
</a>
</div>
<div class="nav-links">
@ -56,7 +56,7 @@
</nav>
<h1>How to Set Up Digital Signage on a Raspberry Pi (2026)</h1>
<p class="lead">A step-by-step guide to turning a Raspberry Pi into a free, open-source digital signage player using ScreenTinker. Works on Pi 3, Pi 4, and Pi 5.</p>
<p class="lead">A step-by-step guide to turning a Raspberry Pi into a free, open-source digital signage player using SwiftDisplay. Works on Pi 3, Pi 4, and Pi 5.</p>
<h2>What you will need</h2>
<ul>
@ -65,7 +65,7 @@
<li><strong>Power supply</strong> appropriate for your model (Pi 4 uses USB-C 15W; Pi 5 uses USB-C 27W).</li>
<li><strong>HDMI cable</strong> to your TV or monitor (micro-HDMI on Pi 4/5).</li>
<li><strong>Network connection</strong> - Ethernet preferred for reliability, Wi-Fi works fine.</li>
<li><strong>A ScreenTinker account.</strong> <a href="/app#/login">Sign up free</a> if you do not have one.</li>
<li><strong>A SwiftDisplay account.</strong> <a href="/app#/login">Sign up free</a> if you do not have one.</li>
</ul>
<h2>Step 1: Install Raspberry Pi OS</h2>
@ -79,9 +79,9 @@
</ul>
<p>Insert the SD card, plug in the Pi, and let it boot through first-time setup.</p>
<h2>Step 2: Run the ScreenTinker installer</h2>
<h2>Step 2: Run the SwiftDisplay installer</h2>
<p>Open a terminal on the Pi and run:</p>
<pre><code>curl -sL https://screentinker.com/scripts/raspberry-pi-setup.sh | bash</code></pre>
<pre><code>curl -sL https://swiftdisplay.com/scripts/raspberry-pi-setup.sh | bash</code></pre>
<p>The script will:</p>
<ul>
<li>Install Chromium (the kiosk browser used as the player)</li>
@ -90,10 +90,10 @@
<li>Configure HDMI to keep the display awake</li>
<li>Reboot the Pi when finished</li>
</ul>
<p>On reboot the Pi will launch directly into the ScreenTinker player and show a 6-digit pairing code.</p>
<p>On reboot the Pi will launch directly into the SwiftDisplay player and show a 6-digit pairing code.</p>
<h2>Step 3: Pair the Pi to your dashboard</h2>
<p>Sign in to <a href="/app#/login">your ScreenTinker dashboard</a> and click <strong>+ Add Display</strong>. Enter the 6-digit code shown on the Pi and give the display a name (e.g. "Lobby TV"). The Pi will switch from the pairing screen to "Waiting for content".</p>
<p>Sign in to <a href="/app#/login">your SwiftDisplay dashboard</a> and click <strong>+ Add Display</strong>. Enter the 6-digit code shown on the Pi and give the display a name (e.g. "Lobby TV"). The Pi will switch from the pairing screen to "Waiting for content".</p>
<h2>Step 4: Push content</h2>
<p>From the dashboard:</p>
@ -115,7 +115,7 @@
<h2>Troubleshooting</h2>
<h3>The Pi reboots into the desktop, not the player</h3>
<p>Check that the autostart file <code>~/.config/autostart/screentinker.desktop</code> exists. The installer creates this; if it's missing, re-run the installer.</p>
<p>Check that the autostart file <code>~/.config/autostart/swiftdisplay.desktop</code> exists. The installer creates this; if it's missing, re-run the installer.</p>
<h3>The screen goes dark after a few minutes</h3>
<p>The installer should disable screen blanking, but some monitors sleep based on their own timer. Disable sleep mode on the monitor itself, or use a dummy HDMI plug if the Pi negotiates a low-power mode.</p>
@ -128,23 +128,23 @@
<ul>
<li><a href="/guides/digital-signage-android-tv.html">Digital signage for Android TV and Fire TV</a></li>
<li><a href="/guides/self-hosted-digital-signage.html">Self-hosted digital signage: complete guide</a></li>
<li><a href="/compare/yodeck-alternative.html">Compare: ScreenTinker vs Yodeck</a></li>
<li><a href="/compare/screencloud-alternative.html">Compare: ScreenTinker vs ScreenCloud</a></li>
<li><a href="/compare/yodeck-alternative.html">Compare: SwiftDisplay vs Yodeck</a></li>
<li><a href="/compare/screencloud-alternative.html">Compare: SwiftDisplay vs ScreenCloud</a></li>
</ul>
</div>
<div class="cta">
<h2>Ready to set up your Pi?</h2>
<p>Start a free ScreenTinker account in under a minute.</p>
<p>Start a free SwiftDisplay account in under a minute.</p>
<a href="/app#/login" class="btn btn-primary" style="padding:14px 28px;font-size:16px">Start Free</a>
<a href="https://github.com/screentinker/screentinker" target="_blank" rel="noopener" class="btn btn-outline" style="padding:14px 28px;font-size:16px;margin-left:12px">View on GitHub</a>
<a href="https://github.com/swiftdisplay/swiftdisplay" target="_blank" rel="noopener" class="btn btn-outline" style="padding:14px 28px;font-size:16px;margin-left:12px">View on GitHub</a>
</div>
</main>
<footer>
<div style="color:var(--dim);font-size:13px">&copy; 2026 ScreenTinker. All rights reserved.</div>
<div style="color:var(--dim);font-size:13px">&copy; 2026 SwiftDisplay. All rights reserved.</div>
<div class="links">
<a href="https://github.com/screentinker/screentinker" target="_blank" rel="noopener">GitHub</a>
<a href="https://github.com/swiftdisplay/swiftdisplay" target="_blank" rel="noopener">GitHub</a>
<a href="https://discord.gg/utTdsrqq4Z" target="_blank" rel="noopener">Discord</a>
<a href="/legal/terms.html">Terms</a>
<a href="/legal/privacy.html">Privacy</a>
@ -158,9 +158,9 @@
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{ "@type": "ListItem", "position": 1, "name": "Home", "item": "https://screentinker.com/" },
{ "@type": "ListItem", "position": 2, "name": "Guides", "item": "https://screentinker.com/" },
{ "@type": "ListItem", "position": 3, "name": "Raspberry Pi Digital Signage", "item": "https://screentinker.com/guides/raspberry-pi-digital-signage.html" }
{ "@type": "ListItem", "position": 1, "name": "Home", "item": "https://swiftdisplay.com/" },
{ "@type": "ListItem", "position": 2, "name": "Guides", "item": "https://swiftdisplay.com/" },
{ "@type": "ListItem", "position": 3, "name": "Raspberry Pi Digital Signage", "item": "https://swiftdisplay.com/guides/raspberry-pi-digital-signage.html" }
]
}
</script>

View file

@ -3,23 +3,23 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Self-Hosted Digital Signage Software - Complete Guide (2026) | ScreenTinker</title>
<meta name="description" content="Why and how to self-host your digital signage CMS. Data privacy, cost control, and no recurring fees. Complete deployment guide using ScreenTinker - open source, MIT licensed.">
<title>Self-Hosted Digital Signage Software - Complete Guide (2026) | SwiftDisplay</title>
<meta name="description" content="Why and how to self-host your digital signage CMS. Data privacy, cost control, and no recurring fees. Complete deployment guide using SwiftDisplay - open source, MIT licensed.">
<meta name="keywords" content="self hosted digital signage, on premise digital signage, self hosted signage cms, open source signage server, deploy signage on premise, private digital signage">
<meta name="robots" content="index, follow">
<link rel="canonical" href="https://screentinker.com/guides/self-hosted-digital-signage.html">
<link rel="canonical" href="https://swiftdisplay.com/guides/self-hosted-digital-signage.html">
<meta property="og:type" content="article">
<meta property="og:url" content="https://screentinker.com/guides/self-hosted-digital-signage.html">
<meta property="og:url" content="https://swiftdisplay.com/guides/self-hosted-digital-signage.html">
<meta property="og:title" content="Self-Hosted Digital Signage Software - Complete Guide (2026)">
<meta property="og:description" content="Why and how to self-host your digital signage CMS. Data privacy, cost control, no recurring fees.">
<meta property="og:image" content="https://screentinker.com/assets/dashboard-preview.png">
<meta property="og:site_name" content="ScreenTinker">
<meta property="og:image" content="https://swiftdisplay.com/assets/dashboard-preview.png">
<meta property="og:site_name" content="SwiftDisplay">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Self-Hosted Digital Signage Software - Complete Guide (2026)">
<meta name="twitter:description" content="Why and how to self-host your digital signage CMS. Data privacy, cost control, no recurring fees.">
<meta name="twitter:image" content="https://screentinker.com/assets/dashboard-preview.png">
<meta name="twitter:image" content="https://swiftdisplay.com/assets/dashboard-preview.png">
<meta name="theme-color" content="#111827">
<link rel="icon" href="/assets/icon-192.png">
@ -32,7 +32,7 @@
<div class="nav-logo">
<a href="/" style="display:flex;align-items:center;gap:10px">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="2" y="3" width="20" height="14" rx="2"/><line x1="8" y1="21" x2="16" y2="21"/><line x1="12" y1="17" x2="12" y2="21"/></svg>
<span class="nav-logo-text">ScreenTinker</span>
<span class="nav-logo-text">SwiftDisplay</span>
</a>
</div>
<div class="nav-links">
@ -56,7 +56,7 @@
</nav>
<h1>Self-Hosted Digital Signage Software: Complete Guide (2026)</h1>
<p class="lead">Why you might want to self-host your digital signage CMS, what you need to do it well, and how to deploy ScreenTinker on your own server.</p>
<p class="lead">Why you might want to self-host your digital signage CMS, what you need to do it well, and how to deploy SwiftDisplay on your own server.</p>
<h2>Why self-host digital signage?</h2>
<p>Most digital signage products are cloud-only. That works for many businesses, but there are real reasons to keep the server in-house:</p>
@ -86,10 +86,10 @@
<li>SSL certificate (Let's Encrypt is free; or self-signed for LAN)</li>
</ul>
<h2>Deploying ScreenTinker</h2>
<p>Detailed setup is in the <a href="https://github.com/screentinker/screentinker" target="_blank" rel="noopener">GitHub README</a>. Quick version:</p>
<pre><code>git clone https://github.com/screentinker/screentinker.git
cd screentinker/server
<h2>Deploying SwiftDisplay</h2>
<p>Detailed setup is in the <a href="https://github.com/swiftdisplay/swiftdisplay" target="_blank" rel="noopener">GitHub README</a>. Quick version:</p>
<pre><code>git clone https://github.com/swiftdisplay/swiftdisplay.git
cd swiftdisplay/server
npm install
cp .env.example .env
# edit .env with your domain, JWT_SECRET, and SELF_HOSTED=true
@ -97,28 +97,28 @@ node server.js</code></pre>
<p>Set <code>SELF_HOSTED=true</code> in the env. This unlocks the enterprise plan for your account, disables subscription expiry checks, and skips Stripe entirely. It is meant for the operator-controlled deployment case.</p>
<h2>Reverse proxy and TLS</h2>
<p>ScreenTinker listens on HTTP/HTTPS directly, but in production you typically front it with nginx or Caddy for TLS termination, gzip, and rate limiting. A minimal Caddyfile:</p>
<p>SwiftDisplay listens on HTTP/HTTPS directly, but in production you typically front it with nginx or Caddy for TLS termination, gzip, and rate limiting. A minimal Caddyfile:</p>
<pre><code>signage.example.com {
reverse_proxy localhost:3001
}</code></pre>
<p>Caddy handles Let's Encrypt automatically. nginx works too if your team prefers it.</p>
<h2>Running as a service</h2>
<p>Use systemd to keep the process alive across reboots. A unit file at <code>/etc/systemd/system/screentinker.service</code>:</p>
<p>Use systemd to keep the process alive across reboots. A unit file at <code>/etc/systemd/system/swiftdisplay.service</code>:</p>
<pre><code>[Unit]
Description=ScreenTinker Digital Signage Server
Description=SwiftDisplay Digital Signage Server
After=network.target
[Service]
WorkingDirectory=/opt/screentinker/server
WorkingDirectory=/opt/swiftdisplay/server
ExecStart=/usr/bin/node server.js
EnvironmentFile=/opt/screentinker/.env
EnvironmentFile=/opt/swiftdisplay/.env
Restart=always
User=screentinker
User=swiftdisplay
[Install]
WantedBy=multi-user.target</code></pre>
<p>Enable with <code>systemctl enable --now screentinker</code>.</p>
<p>Enable with <code>systemctl enable --now swiftdisplay</code>.</p>
<h2>Backups</h2>
<p>The state lives in two places:</p>
@ -132,7 +132,7 @@ WantedBy=multi-user.target</code></pre>
<div class="compare-table-wrap">
<table class="compare-table">
<thead>
<tr><th>Concern</th><th>ScreenTinker self-hosted</th><th>Cloud-only signage products</th></tr>
<tr><th>Concern</th><th>SwiftDisplay self-hosted</th><th>Cloud-only signage products</th></tr>
</thead>
<tbody>
<tr><td>Data location</td><td>Your server</td><td>Vendor's cloud</td></tr>
@ -149,16 +149,16 @@ WantedBy=multi-user.target</code></pre>
</div>
<h2>When the cloud is the right answer</h2>
<p>Self-hosting is not free of cost - it requires someone who can run a Linux server, monitor it, and apply security updates. If your screen count is small (under ~10) and you do not have IT capacity, the managed cloud version is probably the right choice. ScreenTinker's hosted plans start at $39/mo for 5 devices.</p>
<p>Self-hosting is not free of cost - it requires someone who can run a Linux server, monitor it, and apply security updates. If your screen count is small (under ~10) and you do not have IT capacity, the managed cloud version is probably the right choice. SwiftDisplay's hosted plans start at $39/mo for 5 devices.</p>
<div class="related">
<h2>Related guides</h2>
<ul>
<li><a href="/guides/raspberry-pi-digital-signage.html">How to set up digital signage on a Raspberry Pi</a></li>
<li><a href="/guides/digital-signage-android-tv.html">Free digital signage for Android TV and Fire TV</a></li>
<li><a href="/compare/yodeck-alternative.html">Compare: ScreenTinker vs Yodeck</a></li>
<li><a href="/compare/screencloud-alternative.html">Compare: ScreenTinker vs ScreenCloud</a></li>
<li><a href="/compare/optisigns-alternative.html">Compare: ScreenTinker vs OptiSigns</a></li>
<li><a href="/compare/yodeck-alternative.html">Compare: SwiftDisplay vs Yodeck</a></li>
<li><a href="/compare/screencloud-alternative.html">Compare: SwiftDisplay vs ScreenCloud</a></li>
<li><a href="/compare/optisigns-alternative.html">Compare: SwiftDisplay vs OptiSigns</a></li>
</ul>
</div>
@ -166,14 +166,14 @@ WantedBy=multi-user.target</code></pre>
<h2>Try the cloud version first</h2>
<p>Use the hosted version to get familiar, then deploy on your own server when you are ready.</p>
<a href="/app#/login" class="btn btn-primary" style="padding:14px 28px;font-size:16px">Start Free</a>
<a href="https://github.com/screentinker/screentinker" target="_blank" rel="noopener" class="btn btn-outline" style="padding:14px 28px;font-size:16px;margin-left:12px">View on GitHub</a>
<a href="https://github.com/swiftdisplay/swiftdisplay" target="_blank" rel="noopener" class="btn btn-outline" style="padding:14px 28px;font-size:16px;margin-left:12px">View on GitHub</a>
</div>
</main>
<footer>
<div style="color:var(--dim);font-size:13px">&copy; 2026 ScreenTinker. All rights reserved.</div>
<div style="color:var(--dim);font-size:13px">&copy; 2026 SwiftDisplay. All rights reserved.</div>
<div class="links">
<a href="https://github.com/screentinker/screentinker" target="_blank" rel="noopener">GitHub</a>
<a href="https://github.com/swiftdisplay/swiftdisplay" target="_blank" rel="noopener">GitHub</a>
<a href="https://discord.gg/utTdsrqq4Z" target="_blank" rel="noopener">Discord</a>
<a href="/legal/terms.html">Terms</a>
<a href="/legal/privacy.html">Privacy</a>
@ -187,9 +187,9 @@ WantedBy=multi-user.target</code></pre>
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{ "@type": "ListItem", "position": 1, "name": "Home", "item": "https://screentinker.com/" },
{ "@type": "ListItem", "position": 2, "name": "Guides", "item": "https://screentinker.com/" },
{ "@type": "ListItem", "position": 3, "name": "Self-Hosted Digital Signage", "item": "https://screentinker.com/guides/self-hosted-digital-signage.html" }
{ "@type": "ListItem", "position": 1, "name": "Home", "item": "https://swiftdisplay.com/" },
{ "@type": "ListItem", "position": 2, "name": "Guides", "item": "https://swiftdisplay.com/" },
{ "@type": "ListItem", "position": 3, "name": "Self-Hosted Digital Signage", "item": "https://swiftdisplay.com/guides/self-hosted-digital-signage.html" }
]
}
</script>

View file

@ -3,23 +3,23 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>What Is Digital Signage? A Complete Guide (2026) | ScreenTinker</title>
<title>What Is Digital Signage? A Complete Guide (2026) | SwiftDisplay</title>
<meta name="description" content="What is digital signage? A clear guide to how it works, what you can display, common use cases, the hardware you need, and what it costs. Free and open-source options included.">
<meta name="keywords" content="what is digital signage, digital signage, digital signage software, how does digital signage work, digital signage explained, digital signage guide">
<meta name="robots" content="index, follow">
<link rel="canonical" href="https://screentinker.com/guides/what-is-digital-signage.html">
<link rel="canonical" href="https://swiftdisplay.com/guides/what-is-digital-signage.html">
<meta property="og:type" content="article">
<meta property="og:url" content="https://screentinker.com/guides/what-is-digital-signage.html">
<meta property="og:url" content="https://swiftdisplay.com/guides/what-is-digital-signage.html">
<meta property="og:title" content="What Is Digital Signage? A Complete Guide (2026)">
<meta property="og:description" content="How digital signage works, what you can display, common use cases, the hardware you need, and what it costs.">
<meta property="og:image" content="https://screentinker.com/assets/dashboard-preview.png">
<meta property="og:site_name" content="ScreenTinker">
<meta property="og:image" content="https://swiftdisplay.com/assets/dashboard-preview.png">
<meta property="og:site_name" content="SwiftDisplay">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="What Is Digital Signage? A Complete Guide (2026)">
<meta name="twitter:description" content="How digital signage works, what you can display, common use cases, the hardware you need, and what it costs.">
<meta name="twitter:image" content="https://screentinker.com/assets/dashboard-preview.png">
<meta name="twitter:image" content="https://swiftdisplay.com/assets/dashboard-preview.png">
<meta name="theme-color" content="#111827">
<link rel="icon" href="/assets/icon-192.png">
@ -32,7 +32,7 @@
<div class="nav-logo">
<a href="/" style="display:flex;align-items:center;gap:10px">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="2" y="3" width="20" height="14" rx="2"/><line x1="8" y1="21" x2="16" y2="21"/><line x1="12" y1="17" x2="12" y2="21"/></svg>
<span class="nav-logo-text">ScreenTinker</span>
<span class="nav-logo-text">SwiftDisplay</span>
</a>
</div>
<div class="nav-links">
@ -68,7 +68,7 @@
<li><strong>A player.</strong> A small device (or app) connected to the screen that downloads content from the CMS and plays it - even when the network is down.</li>
<li><strong>A display.</strong> The TV, monitor, or video wall that people actually see.</li>
</ul>
<p>In ScreenTinker's model, you manage everything from the CMS, and a free player app runs on the screen. You pair a display with a 6-digit code, assign it a playlist, and the player pulls content and plays it. Playback is offline-native: once content is cached, the screen keeps running through network outages.</p>
<p>In SwiftDisplay's model, you manage everything from the CMS, and a free player app runs on the screen. You pair a display with a 6-digit code, assign it a playlist, and the player pulls content and plays it. Playback is offline-native: once content is cached, the screen keeps running through network outages.</p>
<h2>What can you put on a digital sign?</h2>
<ul>
@ -93,7 +93,7 @@
</ul>
<h2>What hardware do you need?</h2>
<p>Digital signage needs two things: a screen and a player device to drive it. Almost any modern TV or monitor with an HDMI input works as the screen. For the player, ScreenTinker supports a wide range of free options:</p>
<p>Digital signage needs two things: a screen and a player device to drive it. Almost any modern TV or monitor with an HDMI input works as the screen. For the player, SwiftDisplay supports a wide range of free options:</p>
<ul>
<li><strong>Android TV / Fire TV</strong> - a native APK; the most common low-cost choice.</li>
<li><strong>Raspberry Pi</strong> - a free setup script turns a Pi into a kiosk player.</li>
@ -101,11 +101,11 @@
<li><strong>Amazon Vega OS</strong> - the newer Fire TV platform.</li>
<li><strong>Windows, ChromeOS, or any browser</strong> - the web player runs on hardware you may already own.</li>
</ul>
<p>All ScreenTinker players are free, so hardware is the only cost - and it can be as little as a Raspberry Pi or a budget Android TV stick.</p>
<p>All SwiftDisplay players are free, so hardware is the only cost - and it can be as little as a Raspberry Pi or a budget Android TV stick.</p>
<h2>How much does digital signage software cost?</h2>
<p>Pricing splits into two models. Closed cloud SaaS products bill per screen, typically $5-15/screen/month, which adds up quickly across a fleet. Open-source and self-hosted software can be free: with ScreenTinker you can self-host for free with unlimited devices, paying only for a small server (a $5 VPS runs hundreds of screens).</p>
<p>If you prefer managed hosting, ScreenTinker's cloud has a Free plan (1 device, 500MB), Starter at $39/mo (5 devices, 5GB), Pro at $99/mo (15 devices, 20GB, all features), and custom Enterprise pricing. Either way, all player apps are free.</p>
<p>Pricing splits into two models. Closed cloud SaaS products bill per screen, typically $5-15/screen/month, which adds up quickly across a fleet. Open-source and self-hosted software can be free: with SwiftDisplay you can self-host for free with unlimited devices, paying only for a small server (a $5 VPS runs hundreds of screens).</p>
<p>If you prefer managed hosting, SwiftDisplay's cloud has a Free plan (1 device, 500MB), Starter at $39/mo (5 devices, 5GB), Pro at $99/mo (15 devices, 20GB, all features), and custom Enterprise pricing. Either way, all player apps are free.</p>
<h2>Digital signage software vs a plain TV</h2>
<p>You could plug a USB stick into a TV and loop a video - but that is not digital signage. A signage platform adds the management layer that makes screens practical at scale:</p>
@ -122,9 +122,9 @@
<h3>Do I need special hardware?</h3>
<p>Not necessarily. You need a screen and a player device. Almost any TV or monitor with HDMI works, and the player can be an inexpensive Android TV / Fire TV stick, a Raspberry Pi, a compatible Samsung or LG smart TV, or a Windows/ChromeOS device running the web player.</p>
<h3>Is there free digital signage software?</h3>
<p>Yes. ScreenTinker is open-source (MIT licensed) and free to self-host with unlimited devices. There is also a free managed cloud plan for a single device, plus paid tiers if you want hosting managed for you. All player apps are free.</p>
<p>Yes. SwiftDisplay is open-source (MIT licensed) and free to self-host with unlimited devices. There is also a free managed cloud plan for a single device, plus paid tiers if you want hosting managed for you. All player apps are free.</p>
<h3>Can I run digital signage without internet or offline?</h3>
<p>Yes. ScreenTinker's playback is offline-native: once a player has cached its content, it keeps playing through network outages. You can also self-host entirely on a private LAN with no internet at all.</p>
<p>Yes. SwiftDisplay's playback is offline-native: once a player has cached its content, it keeps playing through network outages. You can also self-host entirely on a private LAN with no internet at all.</p>
<h3>What's the difference between digital signage and a smart TV?</h3>
<p>A smart TV plays apps or a looping file on that one screen. Digital signage adds a central CMS that schedules content, manages many screens at once, synchronizes video walls, and reports device status - things a standalone smart TV cannot do.</p>
<h3>What can you display on digital signage?</h3>
@ -136,24 +136,24 @@
<li><a href="/guides/open-source-digital-signage.html">Open source digital signage software: free & self-hosted</a></li>
<li><a href="/guides/self-hosted-digital-signage.html">Self-hosted digital signage: complete guide</a></li>
<li><a href="/guides/raspberry-pi-digital-signage.html">How to set up digital signage on a Raspberry Pi</a></li>
<li><a href="/compare/xibo-alternative.html">Compare: ScreenTinker vs Xibo</a></li>
<li><a href="/compare/anthias-alternative.html">Compare: ScreenTinker vs Anthias</a></li>
<li><a href="/compare/yodeck-alternative.html">Compare: ScreenTinker vs Yodeck</a></li>
<li><a href="/compare/xibo-alternative.html">Compare: SwiftDisplay vs Xibo</a></li>
<li><a href="/compare/anthias-alternative.html">Compare: SwiftDisplay vs Anthias</a></li>
<li><a href="/compare/yodeck-alternative.html">Compare: SwiftDisplay vs Yodeck</a></li>
</ul>
</div>
<div class="cta">
<h2>Try digital signage free</h2>
<p>Start a free ScreenTinker account in under a minute, or self-host the open-source CMS on your own server.</p>
<p>Start a free SwiftDisplay account in under a minute, or self-host the open-source CMS on your own server.</p>
<a href="/app#/login" class="btn btn-primary" style="padding:14px 28px;font-size:16px">Start Free</a>
<a href="https://github.com/screentinker/screentinker" target="_blank" rel="noopener" class="btn btn-outline" style="padding:14px 28px;font-size:16px;margin-left:12px">View on GitHub</a>
<a href="https://github.com/swiftdisplay/swiftdisplay" target="_blank" rel="noopener" class="btn btn-outline" style="padding:14px 28px;font-size:16px;margin-left:12px">View on GitHub</a>
</div>
</main>
<footer>
<div style="color:var(--dim);font-size:13px">&copy; 2026 ScreenTinker. All rights reserved.</div>
<div style="color:var(--dim);font-size:13px">&copy; 2026 SwiftDisplay. All rights reserved.</div>
<div class="links">
<a href="https://github.com/screentinker/screentinker" target="_blank" rel="noopener">GitHub</a>
<a href="https://github.com/swiftdisplay/swiftdisplay" target="_blank" rel="noopener">GitHub</a>
<a href="https://discord.gg/utTdsrqq4Z" target="_blank" rel="noopener">Discord</a>
<a href="/legal/terms.html">Terms</a>
<a href="/legal/privacy.html">Privacy</a>
@ -167,9 +167,9 @@
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{ "@type": "ListItem", "position": 1, "name": "Home", "item": "https://screentinker.com/" },
{ "@type": "ListItem", "position": 2, "name": "Guides", "item": "https://screentinker.com/" },
{ "@type": "ListItem", "position": 3, "name": "What Is Digital Signage", "item": "https://screentinker.com/guides/what-is-digital-signage.html" }
{ "@type": "ListItem", "position": 1, "name": "Home", "item": "https://swiftdisplay.com/" },
{ "@type": "ListItem", "position": 2, "name": "Guides", "item": "https://swiftdisplay.com/" },
{ "@type": "ListItem", "position": 3, "name": "What Is Digital Signage", "item": "https://swiftdisplay.com/guides/what-is-digital-signage.html" }
]
}
</script>
@ -191,12 +191,12 @@
{
"@type": "Question",
"name": "Is there free digital signage software?",
"acceptedAnswer": { "@type": "Answer", "text": "Yes. ScreenTinker is open-source (MIT licensed) and free to self-host with unlimited devices. There is also a free managed cloud plan for a single device, plus paid tiers if you want hosting managed for you. All player apps are free." }
"acceptedAnswer": { "@type": "Answer", "text": "Yes. SwiftDisplay is open-source (MIT licensed) and free to self-host with unlimited devices. There is also a free managed cloud plan for a single device, plus paid tiers if you want hosting managed for you. All player apps are free." }
},
{
"@type": "Question",
"name": "Can I run digital signage without internet or offline?",
"acceptedAnswer": { "@type": "Answer", "text": "Yes. ScreenTinker's playback is offline-native: once a player has cached its content, it keeps playing through network outages. You can also self-host entirely on a private LAN with no internet at all." }
"acceptedAnswer": { "@type": "Answer", "text": "Yes. SwiftDisplay's playback is offline-native: once a player has cached its content, it keeps playing through network outages. You can also self-host entirely on a private LAN with no internet at all." }
},
{
"@type": "Question",

View file

@ -40,7 +40,7 @@
<div class="logo">
<img src="/assets/logowhiteswift.png" alt="Logo" style="height: 28px;">
</div>
<!-- #38: apply cached white-label before first paint (no ScreenTinker flash) -->
<!-- #38: apply cached white-label before first paint (no SwiftDisplay flash) -->
<script src="/js/brand-prime.js"></script>
<div class="workspace-switcher" id="workspaceSwitcher"></div>
</div>

View file

@ -3,23 +3,23 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>How to Display Canva Designs on Digital Signage (2026) | ScreenTinker</title>
<meta name="description" content="Show a Canva design on digital signage. Publish it as a website, paste the public link into ScreenTinker's Webpage widget, and loop it as a slideshow on any screen. Step-by-step guide.">
<title>How to Display Canva Designs on Digital Signage (2026) | SwiftDisplay</title>
<meta name="description" content="Show a Canva design on digital signage. Publish it as a website, paste the public link into SwiftDisplay's Webpage widget, and loop it as a slideshow on any screen. Step-by-step guide.">
<meta name="keywords" content="canva digital signage, canva on tv, canva signage, publish canva website, canva embed signage, canva slideshow kiosk">
<meta name="robots" content="index, follow">
<link rel="canonical" href="https://screentinker.com/integrations/canva-digital-signage.html">
<link rel="canonical" href="https://swiftdisplay.com/integrations/canva-digital-signage.html">
<meta property="og:type" content="article">
<meta property="og:url" content="https://screentinker.com/integrations/canva-digital-signage.html">
<meta property="og:url" content="https://swiftdisplay.com/integrations/canva-digital-signage.html">
<meta property="og:title" content="How to Display Canva Designs on Digital Signage (2026)">
<meta property="og:description" content="Publish a Canva design as a website and paste the link into ScreenTinker's Webpage widget to loop it on any screen.">
<meta property="og:image" content="https://screentinker.com/assets/dashboard-preview.png">
<meta property="og:site_name" content="ScreenTinker">
<meta property="og:description" content="Publish a Canva design as a website and paste the link into SwiftDisplay's Webpage widget to loop it on any screen.">
<meta property="og:image" content="https://swiftdisplay.com/assets/dashboard-preview.png">
<meta property="og:site_name" content="SwiftDisplay">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="How to Display Canva Designs on Digital Signage (2026)">
<meta name="twitter:description" content="Publish a Canva design as a website and paste the link into ScreenTinker's Webpage widget to loop it on any screen.">
<meta name="twitter:image" content="https://screentinker.com/assets/dashboard-preview.png">
<meta name="twitter:description" content="Publish a Canva design as a website and paste the link into SwiftDisplay's Webpage widget to loop it on any screen.">
<meta name="twitter:image" content="https://swiftdisplay.com/assets/dashboard-preview.png">
<meta name="theme-color" content="#111827">
<link rel="icon" href="/assets/icon-192.png">
@ -32,7 +32,7 @@
<div class="nav-logo">
<a href="/" style="display:flex;align-items:center;gap:10px">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="2" y="3" width="20" height="14" rx="2"/><line x1="8" y1="21" x2="16" y2="21"/><line x1="12" y1="17" x2="12" y2="21"/></svg>
<span class="nav-logo-text">ScreenTinker</span>
<span class="nav-logo-text">SwiftDisplay</span>
</a>
</div>
<div class="nav-links">
@ -56,17 +56,17 @@
</nav>
<h1>How to display Canva designs on a digital signage screen</h1>
<p class="lead">ScreenTinker has no dedicated "Canva app," and it does not need one. Canva can publish a design as a public website, and ScreenTinker's universal Webpage widget can show that public link on any screen - looping it as a slideshow for lobbies, menus, and announcement boards.</p>
<p class="lead">SwiftDisplay has no dedicated "Canva app," and it does not need one. Canva can publish a design as a public website, and SwiftDisplay's universal Webpage widget can show that public link on any screen - looping it as a slideshow for lobbies, menus, and announcement boards.</p>
<h2>The short version</h2>
<p>In Canva, open <strong>Share &rarr; Publish &rarr; Website</strong> (or <strong>Embed</strong>), copy the public link, then add a <strong>Webpage</strong> widget in ScreenTinker, paste the link, add it to a playlist, and assign the playlist to a screen. That is the entire integration.</p>
<p>In Canva, open <strong>Share &rarr; Publish &rarr; Website</strong> (or <strong>Embed</strong>), copy the public link, then add a <strong>Webpage</strong> widget in SwiftDisplay, paste the link, add it to a playlist, and assign the playlist to a screen. That is the entire integration.</p>
<h2>Step by step</h2>
<ol>
<li><strong>Open your design</strong> in Canva and click <strong>Share</strong> in the top-right.</li>
<li><strong>Choose Publish &rarr; Website</strong> (or the <strong>Embed</strong> option). For a multi-page design, pick a navigation style such as <em>Scroll</em> or a presentation layout so all pages are reachable.</li>
<li><strong>Publish the design</strong> and copy the public website link (or the <code>src</code> URL from the embed snippet). This is a public URL - <em>not</em> your normal edit link.</li>
<li><strong>In ScreenTinker, add a Webpage widget.</strong> Create or edit a playlist item and select the <strong>Webpage</strong> widget type.</li>
<li><strong>In SwiftDisplay, add a Webpage widget.</strong> Create or edit a playlist item and select the <strong>Webpage</strong> widget type.</li>
<li><strong>Paste the Canva public link</strong> into the URL field and save.</li>
<li><strong>Add the widget to a playlist</strong> and set a duration long enough to show the whole design.</li>
<li><strong>Assign the playlist to a screen.</strong> The player loads the published design and displays it on the wall.</li>
@ -80,7 +80,7 @@
<li><strong>The edit URL</strong> (contains <code>/design/</code> and <code>/edit</code>) requires a Canva login and blocks framing - it will <em>not</em> appear in the Webpage widget.</li>
<li><strong>The published website / embed URL</strong> (from <em>Publish &rarr; Website</em> or <em>Embed</em>) is public and framable. Always use this one.</li>
</ul>
<p>As with any embedded page, the deciding factor is <code>X-Frame-Options</code> / <code>frame-ancestors</code>: a page that denies framing cannot be shown in ScreenTinker's Webpage widget, because the widget is an iframe. Canva's published website URL is served to allow embedding; the private edit link is not. If your design does not show up, the URL is the first thing to check.</p>
<p>As with any embedded page, the deciding factor is <code>X-Frame-Options</code> / <code>frame-ancestors</code>: a page that denies framing cannot be shown in SwiftDisplay's Webpage widget, because the widget is an iframe. Canva's published website URL is served to allow embedding; the private edit link is not. If your design does not show up, the URL is the first thing to check.</p>
<h2>Auto-advance and refresh tips</h2>
<ul>
@ -105,7 +105,7 @@
<p>Not always automatically. Canva may keep serving the previously published version, so re-publish after edits to make sure the screen loads the latest.</p>
<h3>Is there a native Canva widget?</h3>
<p>No - this uses the universal Webpage widget with the design's published website URL. That is the supported way to show Canva on ScreenTinker.</p>
<p>No - this uses the universal Webpage widget with the design's published website URL. That is the supported way to show Canva on SwiftDisplay.</p>
<div class="related">
<h2>Related guides</h2>
@ -119,17 +119,17 @@
</div>
<div class="cta">
<h2>Try ScreenTinker free</h2>
<h2>Try SwiftDisplay free</h2>
<p>Add a Webpage widget, paste your published Canva link, and see it on a screen in minutes. Free plan, no credit card required.</p>
<a href="/app#/login" class="btn btn-primary" style="padding:14px 28px;font-size:16px">Start Free</a>
<a href="https://github.com/screentinker/screentinker" target="_blank" rel="noopener" class="btn btn-outline" style="padding:14px 28px;font-size:16px;margin-left:12px">View on GitHub</a>
<a href="https://github.com/swiftdisplay/swiftdisplay" target="_blank" rel="noopener" class="btn btn-outline" style="padding:14px 28px;font-size:16px;margin-left:12px">View on GitHub</a>
</div>
</main>
<footer>
<div style="color:var(--dim);font-size:13px">&copy; 2026 ScreenTinker. All rights reserved.</div>
<div style="color:var(--dim);font-size:13px">&copy; 2026 SwiftDisplay. All rights reserved.</div>
<div class="links">
<a href="https://github.com/screentinker/screentinker" target="_blank" rel="noopener">GitHub</a>
<a href="https://github.com/swiftdisplay/swiftdisplay" target="_blank" rel="noopener">GitHub</a>
<a href="https://discord.gg/utTdsrqq4Z" target="_blank" rel="noopener">Discord</a>
<a href="/legal/terms.html">Terms</a>
<a href="/legal/privacy.html">Privacy</a>
@ -143,9 +143,9 @@
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{ "@type": "ListItem", "position": 1, "name": "Home", "item": "https://screentinker.com/" },
{ "@type": "ListItem", "position": 2, "name": "Integrations", "item": "https://screentinker.com/integrations/" },
{ "@type": "ListItem", "position": 3, "name": "Canva", "item": "https://screentinker.com/integrations/canva-digital-signage.html" }
{ "@type": "ListItem", "position": 1, "name": "Home", "item": "https://swiftdisplay.com/" },
{ "@type": "ListItem", "position": 2, "name": "Integrations", "item": "https://swiftdisplay.com/integrations/" },
{ "@type": "ListItem", "position": 3, "name": "Canva", "item": "https://swiftdisplay.com/integrations/canva-digital-signage.html" }
]
}
</script>
@ -158,7 +158,7 @@
{ "@type": "Question", "name": "Does the design have to be public?", "acceptedAnswer": { "@type": "Answer", "text": "Yes. Only a published, public Canva design embeds. Private designs are login-gated and cannot be shown on an unattended signage player." } },
{ "@type": "Question", "name": "Can I loop a multi-page design as a slideshow?", "acceptedAnswer": { "@type": "Answer", "text": "Yes. Choose a presentation or autoplay publish option so the pages advance automatically and loop, then set the widget duration to cover the full cycle." } },
{ "@type": "Question", "name": "Will the screen update when I change the design?", "acceptedAnswer": { "@type": "Answer", "text": "Not always automatically. Canva may keep serving the previously published version, so re-publish after edits to make sure the screen loads the latest." } },
{ "@type": "Question", "name": "Is there a native Canva widget?", "acceptedAnswer": { "@type": "Answer", "text": "No - this uses the universal Webpage widget with the design's published website URL. That is the supported way to show Canva on ScreenTinker." } }
{ "@type": "Question", "name": "Is there a native Canva widget?", "acceptedAnswer": { "@type": "Answer", "text": "No - this uses the universal Webpage widget with the design's published website URL. That is the supported way to show Canva on SwiftDisplay." } }
]
}
</script>

View file

@ -3,23 +3,23 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>How to Put Google Slides on Digital Signage (2026) | ScreenTinker</title>
<meta name="description" content="Show a Google Slides deck on digital signage. Publish the slideshow to the web, paste the published URL into ScreenTinker's Webpage widget, and let it auto-advance on any screen. Step-by-step guide.">
<title>How to Put Google Slides on Digital Signage (2026) | SwiftDisplay</title>
<meta name="description" content="Show a Google Slides deck on digital signage. Publish the slideshow to the web, paste the published URL into SwiftDisplay's Webpage widget, and let it auto-advance on any screen. Step-by-step guide.">
<meta name="keywords" content="google slides digital signage, google slides on tv, google slides signage, publish google slides to web, google slides embed signage, google slides kiosk">
<meta name="robots" content="index, follow">
<link rel="canonical" href="https://screentinker.com/integrations/google-slides-digital-signage.html">
<link rel="canonical" href="https://swiftdisplay.com/integrations/google-slides-digital-signage.html">
<meta property="og:type" content="article">
<meta property="og:url" content="https://screentinker.com/integrations/google-slides-digital-signage.html">
<meta property="og:url" content="https://swiftdisplay.com/integrations/google-slides-digital-signage.html">
<meta property="og:title" content="How to Put Google Slides on Digital Signage (2026)">
<meta property="og:description" content="Publish a Slides deck to the web and paste the URL into ScreenTinker's Webpage widget to auto-advance it on any screen.">
<meta property="og:image" content="https://screentinker.com/assets/dashboard-preview.png">
<meta property="og:site_name" content="ScreenTinker">
<meta property="og:description" content="Publish a Slides deck to the web and paste the URL into SwiftDisplay's Webpage widget to auto-advance it on any screen.">
<meta property="og:image" content="https://swiftdisplay.com/assets/dashboard-preview.png">
<meta property="og:site_name" content="SwiftDisplay">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="How to Put Google Slides on Digital Signage (2026)">
<meta name="twitter:description" content="Publish a Slides deck to the web and paste the URL into ScreenTinker's Webpage widget to auto-advance it on any screen.">
<meta name="twitter:image" content="https://screentinker.com/assets/dashboard-preview.png">
<meta name="twitter:description" content="Publish a Slides deck to the web and paste the URL into SwiftDisplay's Webpage widget to auto-advance it on any screen.">
<meta name="twitter:image" content="https://swiftdisplay.com/assets/dashboard-preview.png">
<meta name="theme-color" content="#111827">
<link rel="icon" href="/assets/icon-192.png">
@ -32,7 +32,7 @@
<div class="nav-logo">
<a href="/" style="display:flex;align-items:center;gap:10px">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="2" y="3" width="20" height="14" rx="2"/><line x1="8" y1="21" x2="16" y2="21"/><line x1="12" y1="17" x2="12" y2="21"/></svg>
<span class="nav-logo-text">ScreenTinker</span>
<span class="nav-logo-text">SwiftDisplay</span>
</a>
</div>
<div class="nav-links">
@ -56,17 +56,17 @@
</nav>
<h1>How to put Google Slides on a digital signage screen</h1>
<p class="lead">ScreenTinker does not have a dedicated "Google Slides app" - and it does not need one. Google Slides can publish a deck to the web, and ScreenTinker's universal Webpage widget can display that published URL on any screen, auto-advancing through the slides on a loop.</p>
<p class="lead">SwiftDisplay does not have a dedicated "Google Slides app" - and it does not need one. Google Slides can publish a deck to the web, and SwiftDisplay's universal Webpage widget can display that published URL on any screen, auto-advancing through the slides on a loop.</p>
<h2>The short version</h2>
<p>In Google Slides, go to <strong>File &rarr; Share &rarr; Publish to web &rarr; Embed</strong>, set the auto-advance interval, and copy the published URL. In ScreenTinker, add a <strong>Webpage</strong> widget, paste that URL, drop the widget into a playlist, and assign the playlist to a screen. That is the whole integration.</p>
<p>In Google Slides, go to <strong>File &rarr; Share &rarr; Publish to web &rarr; Embed</strong>, set the auto-advance interval, and copy the published URL. In SwiftDisplay, add a <strong>Webpage</strong> widget, paste that URL, drop the widget into a playlist, and assign the playlist to a screen. That is the whole integration.</p>
<h2>Step by step</h2>
<ol>
<li><strong>Open your deck</strong> in Google Slides and choose <strong>File &rarr; Share &rarr; Publish to web</strong>.</li>
<li><strong>Switch to the "Embed" tab.</strong> Pick how fast slides should advance (for example, every 5 seconds) and tick <em>Auto-advance</em> and <em>Restart the slideshow after the last slide</em> so it loops forever.</li>
<li><strong>Click Publish</strong> and confirm. Copy the published URL from the embed snippet - it is the <code>src</code> value that looks like the one below, <em>not</em> your normal editing link.</li>
<li><strong>In ScreenTinker, add a Webpage widget.</strong> Open your dashboard, create or edit a playlist item, and choose the <strong>Webpage</strong> widget type.</li>
<li><strong>In SwiftDisplay, add a Webpage widget.</strong> Open your dashboard, create or edit a playlist item, and choose the <strong>Webpage</strong> widget type.</li>
<li><strong>Paste the published URL</strong> into the widget's URL field and save.</li>
<li><strong>Add the widget to a playlist</strong> and set its duration to at least one full loop of the deck.</li>
<li><strong>Assign the playlist to a screen.</strong> The player pulls the published deck and it starts advancing on the wall.</li>
@ -81,14 +81,14 @@
<li><strong>The /present URL</strong> (ends in <code>/present</code>) is presenter mode and also blocks framing.</li>
<li><strong>The published URL</strong> from <em>Publish to web</em> (contains <code>/pub</code> or <code>/pubembed</code>) is the only one that permits embedding. Always use this one.</li>
</ul>
<p>The reason is <code>X-Frame-Options</code> / <code>frame-ancestors</code>: any page that sends those headers to deny framing cannot be shown in an iframe, and ScreenTinker's Webpage widget is an iframe. The published URL is served without that restriction specifically so it can be embedded. If your slides do not appear, the URL is almost always the cause.</p>
<p>The reason is <code>X-Frame-Options</code> / <code>frame-ancestors</code>: any page that sends those headers to deny framing cannot be shown in an iframe, and SwiftDisplay's Webpage widget is an iframe. The published URL is served without that restriction specifically so it can be embedded. If your slides do not appear, the URL is almost always the cause.</p>
<h2>Auto-advance and refresh tips</h2>
<ul>
<li><strong>Set the pace in Slides, not ScreenTinker.</strong> The <code>delayms</code> parameter in the published URL controls how long each slide holds. Adjust it by re-publishing with a different interval, or edit the <code>delayms</code> value directly in the URL (milliseconds).</li>
<li><strong>Set the pace in Slides, not SwiftDisplay.</strong> The <code>delayms</code> parameter in the published URL controls how long each slide holds. Adjust it by re-publishing with a different interval, or edit the <code>delayms</code> value directly in the URL (milliseconds).</li>
<li><strong>Keep <code>loop=true</code></strong> so the deck restarts after the last slide and never goes blank.</li>
<li><strong>Give the playlist item enough time.</strong> Set the Webpage widget's on-screen duration to at least the length of one full loop so viewers see every slide.</li>
<li><strong>Content updates are automatic-ish.</strong> When you edit the source deck, Google re-publishes changes to the published URL within a short window (usually a few minutes), so the sign updates without touching ScreenTinker.</li>
<li><strong>Content updates are automatic-ish.</strong> When you edit the source deck, Google re-publishes changes to the published URL within a short window (usually a few minutes), so the sign updates without touching SwiftDisplay.</li>
</ul>
<h2>FAQ</h2>
@ -103,10 +103,10 @@
<p>Yes. Enable auto-advance when you publish and set the interval; the <code>delayms</code> and <code>loop</code> parameters in the published URL handle timing and looping.</p>
<h3>Will the sign update when I edit the deck?</h3>
<p>Yes, on a short delay. Google re-publishes edits to the published URL automatically, so the screen picks up changes without any change in ScreenTinker.</p>
<p>Yes, on a short delay. Google re-publishes edits to the published URL automatically, so the screen picks up changes without any change in SwiftDisplay.</p>
<h3>Is there a native Google Slides widget?</h3>
<p>No - this uses the universal Webpage widget with the deck's published URL. That is the supported and reliable way to show Slides on ScreenTinker.</p>
<p>No - this uses the universal Webpage widget with the deck's published URL. That is the supported and reliable way to show Slides on SwiftDisplay.</p>
<div class="related">
<h2>Related guides</h2>
@ -120,17 +120,17 @@
</div>
<div class="cta">
<h2>Try ScreenTinker free</h2>
<h2>Try SwiftDisplay free</h2>
<p>Add a Webpage widget, paste your published deck, and see it on a screen in minutes. Free plan, no credit card required.</p>
<a href="/app#/login" class="btn btn-primary" style="padding:14px 28px;font-size:16px">Start Free</a>
<a href="https://github.com/screentinker/screentinker" target="_blank" rel="noopener" class="btn btn-outline" style="padding:14px 28px;font-size:16px;margin-left:12px">View on GitHub</a>
<a href="https://github.com/swiftdisplay/swiftdisplay" target="_blank" rel="noopener" class="btn btn-outline" style="padding:14px 28px;font-size:16px;margin-left:12px">View on GitHub</a>
</div>
</main>
<footer>
<div style="color:var(--dim);font-size:13px">&copy; 2026 ScreenTinker. All rights reserved.</div>
<div style="color:var(--dim);font-size:13px">&copy; 2026 SwiftDisplay. All rights reserved.</div>
<div class="links">
<a href="https://github.com/screentinker/screentinker" target="_blank" rel="noopener">GitHub</a>
<a href="https://github.com/swiftdisplay/swiftdisplay" target="_blank" rel="noopener">GitHub</a>
<a href="https://discord.gg/utTdsrqq4Z" target="_blank" rel="noopener">Discord</a>
<a href="/legal/terms.html">Terms</a>
<a href="/legal/privacy.html">Privacy</a>
@ -144,9 +144,9 @@
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{ "@type": "ListItem", "position": 1, "name": "Home", "item": "https://screentinker.com/" },
{ "@type": "ListItem", "position": 2, "name": "Integrations", "item": "https://screentinker.com/integrations/" },
{ "@type": "ListItem", "position": 3, "name": "Google Slides", "item": "https://screentinker.com/integrations/google-slides-digital-signage.html" }
{ "@type": "ListItem", "position": 1, "name": "Home", "item": "https://swiftdisplay.com/" },
{ "@type": "ListItem", "position": 2, "name": "Integrations", "item": "https://swiftdisplay.com/integrations/" },
{ "@type": "ListItem", "position": 3, "name": "Google Slides", "item": "https://swiftdisplay.com/integrations/google-slides-digital-signage.html" }
]
}
</script>
@ -158,8 +158,8 @@
{ "@type": "Question", "name": "Why won't my Google Slides link show up on the screen?", "acceptedAnswer": { "@type": "Answer", "text": "You almost certainly pasted the /edit or /present URL. Those require a login and block framing. Go back to File > Share > Publish to web and copy the published /pubembed URL instead." } },
{ "@type": "Question", "name": "Do viewers need a Google account to see the deck?", "acceptedAnswer": { "@type": "Answer", "text": "No. A published-to-web deck is public and renders without any login, which is why it works on an unattended signage player." } },
{ "@type": "Question", "name": "Can I make the slides advance automatically?", "acceptedAnswer": { "@type": "Answer", "text": "Yes. Enable auto-advance when you publish and set the interval; the delayms and loop parameters in the published URL handle timing and looping." } },
{ "@type": "Question", "name": "Will the sign update when I edit the deck?", "acceptedAnswer": { "@type": "Answer", "text": "Yes, on a short delay. Google re-publishes edits to the published URL automatically, so the screen picks up changes without any change in ScreenTinker." } },
{ "@type": "Question", "name": "Is there a native Google Slides widget?", "acceptedAnswer": { "@type": "Answer", "text": "No - this uses the universal Webpage widget with the deck's published URL. That is the supported and reliable way to show Slides on ScreenTinker." } }
{ "@type": "Question", "name": "Will the sign update when I edit the deck?", "acceptedAnswer": { "@type": "Answer", "text": "Yes, on a short delay. Google re-publishes edits to the published URL automatically, so the screen picks up changes without any change in SwiftDisplay." } },
{ "@type": "Question", "name": "Is there a native Google Slides widget?", "acceptedAnswer": { "@type": "Answer", "text": "No - this uses the universal Webpage widget with the deck's published URL. That is the supported and reliable way to show Slides on SwiftDisplay." } }
]
}
</script>

View file

@ -3,23 +3,23 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Digital Signage Integrations - Connect Any App | ScreenTinker</title>
<meta name="description" content="Connect ScreenTinker to the apps you already use. Native widgets for YouTube, RSS, weather, and clocks, plus a universal Webpage widget that embeds any public URL - Google Slides, Canva, Power BI, and more.">
<meta name="keywords" content="digital signage integrations, digital signage widgets, embed webpage digital signage, google slides signage, canva signage, power bi signage, screentinker integrations">
<title>Digital Signage Integrations - Connect Any App | SwiftDisplay</title>
<meta name="description" content="Connect SwiftDisplay to the apps you already use. Native widgets for YouTube, RSS, weather, and clocks, plus a universal Webpage widget that embeds any public URL - Google Slides, Canva, Power BI, and more.">
<meta name="keywords" content="digital signage integrations, digital signage widgets, embed webpage digital signage, google slides signage, canva signage, power bi signage, swiftdisplay integrations">
<meta name="robots" content="index, follow">
<link rel="canonical" href="https://screentinker.com/integrations/index.html">
<link rel="canonical" href="https://swiftdisplay.com/integrations/index.html">
<meta property="og:type" content="website">
<meta property="og:url" content="https://screentinker.com/integrations/index.html">
<meta property="og:title" content="Digital Signage Integrations - Connect Any App | ScreenTinker">
<meta property="og:url" content="https://swiftdisplay.com/integrations/index.html">
<meta property="og:title" content="Digital Signage Integrations - Connect Any App | SwiftDisplay">
<meta property="og:description" content="Native widgets plus a universal Webpage widget that embeds any public URL - Google Slides, Canva, Power BI, and more.">
<meta property="og:image" content="https://screentinker.com/assets/dashboard-preview.png">
<meta property="og:site_name" content="ScreenTinker">
<meta property="og:image" content="https://swiftdisplay.com/assets/dashboard-preview.png">
<meta property="og:site_name" content="SwiftDisplay">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Digital Signage Integrations - Connect Any App">
<meta name="twitter:description" content="Native widgets plus a universal Webpage widget that embeds any public URL - Google Slides, Canva, Power BI, and more.">
<meta name="twitter:image" content="https://screentinker.com/assets/dashboard-preview.png">
<meta name="twitter:image" content="https://swiftdisplay.com/assets/dashboard-preview.png">
<meta name="theme-color" content="#111827">
<link rel="icon" href="/assets/icon-192.png">
@ -32,7 +32,7 @@
<div class="nav-logo">
<a href="/" style="display:flex;align-items:center;gap:10px">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="2" y="3" width="20" height="14" rx="2"/><line x1="8" y1="21" x2="16" y2="21"/><line x1="12" y1="17" x2="12" y2="21"/></svg>
<span class="nav-logo-text">ScreenTinker</span>
<span class="nav-logo-text">SwiftDisplay</span>
</a>
</div>
<div class="nav-links">
@ -54,10 +54,10 @@
</nav>
<h1>Digital Signage Integrations</h1>
<p class="lead">ScreenTinker connects to the tools you already use in two ways: purpose-built <strong>native widgets</strong> for common content types, and a universal <strong>Webpage widget</strong> that embeds any public web page on your screens. Between the two, most apps that can produce a public link can appear on a ScreenTinker display.</p>
<p class="lead">SwiftDisplay connects to the tools you already use in two ways: purpose-built <strong>native widgets</strong> for common content types, and a universal <strong>Webpage widget</strong> that embeds any public web page on your screens. Between the two, most apps that can produce a public link can appear on a SwiftDisplay display.</p>
<h2>Native widgets</h2>
<p>These are built directly into ScreenTinker. You configure them in the dashboard - no embed URL required - and they render natively on every player (Android TV, Fire TV, Tizen, webOS, Vega, Raspberry Pi, Windows, ChromeOS, and the browser player).</p>
<p>These are built directly into SwiftDisplay. You configure them in the dashboard - no embed URL required - and they render natively on every player (Android TV, Fire TV, Tizen, webOS, Vega, Raspberry Pi, Windows, ChromeOS, and the browser player).</p>
<ul>
<li><strong><a href="/integrations/youtube-digital-signage.html">YouTube</a>.</strong> Play a single video, a playlist, or a live stream, with autoplay and loop handled for you.</li>
<li><strong><a href="/integrations/rss-digital-signage.html">RSS</a>.</strong> Pull headlines from any feed - news, blogs, internal announcements - and rotate them on screen.</li>
@ -69,7 +69,7 @@
</ul>
<h2>Embed anything with the Webpage widget</h2>
<p>The Webpage widget renders any framable public URL inside an iframe on your screen. If a service can publish a public link and does not block framing, you can put it on a display - no dedicated integration needed. This is how you connect apps that ScreenTinker does not have a native widget for.</p>
<p>The Webpage widget renders any framable public URL inside an iframe on your screen. If a service can publish a public link and does not block framing, you can put it on a display - no dedicated integration needed. This is how you connect apps that SwiftDisplay does not have a native widget for.</p>
<p><strong>Honest caveat:</strong> sites that send <code>X-Frame-Options</code> or a <code>frame-ancestors</code> Content-Security-Policy that denies embedding <em>cannot</em> be shown in the Webpage widget. You must use each service's official "publish to web" / "embed" URL - not the normal share, edit, or present URL - because the published URL is the one that permits framing.</p>
<ul>
<li><strong><a href="/integrations/google-slides-digital-signage.html">Google Slides</a>.</strong> Publish a deck to the web and auto-advance it as an announcement board.</li>
@ -82,11 +82,11 @@
<h2>Frequently asked questions</h2>
<h3>Can ScreenTinker integrate with a specific app?</h3>
<h3>Can SwiftDisplay integrate with a specific app?</h3>
<p>If the app has a native widget above, use that. Otherwise: if the app can produce a public embed or "publish to web" URL that allows framing, then yes - add a Webpage widget and paste that URL. If the only URL the app offers denies framing, it cannot be embedded, and you would need a screenshot, export, or a native widget instead.</p>
<h3>What is the difference between a native widget and the Webpage widget?</h3>
<p>Native widgets are built into ScreenTinker and configured with a few fields in the dashboard; they render reliably on every player. The Webpage widget is a generic iframe - more flexible, since it can show almost any public page, but subject to the framing rules of the site you point it at.</p>
<p>Native widgets are built into SwiftDisplay and configured with a few fields in the dashboard; they render reliably on every player. The Webpage widget is a generic iframe - more flexible, since it can show almost any public page, but subject to the framing rules of the site you point it at.</p>
<h3>Do I need a paid plan to use integrations?</h3>
<p>No. Native widgets and the Webpage widget are available on the free plan and in self-hosted deployments. Plans differ by device count and storage, not by which widgets you can use.</p>
@ -103,17 +103,17 @@
</div>
<div class="cta">
<h2>Try ScreenTinker free</h2>
<h2>Try SwiftDisplay free</h2>
<p>Add a widget, drop in a URL, and see it on a screen in minutes. Free plan, no credit card required.</p>
<a href="/app#/login" class="btn btn-primary" style="padding:14px 28px;font-size:16px">Start Free</a>
<a href="https://github.com/screentinker/screentinker" target="_blank" rel="noopener" class="btn btn-outline" style="padding:14px 28px;font-size:16px;margin-left:12px">View on GitHub</a>
<a href="https://github.com/swiftdisplay/swiftdisplay" target="_blank" rel="noopener" class="btn btn-outline" style="padding:14px 28px;font-size:16px;margin-left:12px">View on GitHub</a>
</div>
</main>
<footer>
<div style="color:var(--dim);font-size:13px">&copy; 2026 ScreenTinker. All rights reserved.</div>
<div style="color:var(--dim);font-size:13px">&copy; 2026 SwiftDisplay. All rights reserved.</div>
<div class="links">
<a href="https://github.com/screentinker/screentinker" target="_blank" rel="noopener">GitHub</a>
<a href="https://github.com/swiftdisplay/swiftdisplay" target="_blank" rel="noopener">GitHub</a>
<a href="https://discord.gg/utTdsrqq4Z" target="_blank" rel="noopener">Discord</a>
<a href="/legal/terms.html">Terms</a>
<a href="/legal/privacy.html">Privacy</a>
@ -127,8 +127,8 @@
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{ "@type": "ListItem", "position": 1, "name": "Home", "item": "https://screentinker.com/" },
{ "@type": "ListItem", "position": 2, "name": "Integrations", "item": "https://screentinker.com/integrations/" }
{ "@type": "ListItem", "position": 1, "name": "Home", "item": "https://swiftdisplay.com/" },
{ "@type": "ListItem", "position": 2, "name": "Integrations", "item": "https://swiftdisplay.com/integrations/" }
]
}
</script>

View file

@ -3,23 +3,23 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Power BI Dashboards on Digital Signage (2026) | ScreenTinker</title>
<meta name="description" content="Put a live Power BI dashboard on a digital signage screen. Use Publish to web to get an embeddable URL, paste it into ScreenTinker's Webpage widget, and show a self-refreshing report on the wall. Includes the important public-data security caveat.">
<title>Power BI Dashboards on Digital Signage (2026) | SwiftDisplay</title>
<meta name="description" content="Put a live Power BI dashboard on a digital signage screen. Use Publish to web to get an embeddable URL, paste it into SwiftDisplay's Webpage widget, and show a self-refreshing report on the wall. Includes the important public-data security caveat.">
<meta name="keywords" content="power bi digital signage, power bi on tv, power bi dashboard wall, power bi publish to web, power bi embed signage, power bi kiosk display">
<meta name="robots" content="index, follow">
<link rel="canonical" href="https://screentinker.com/integrations/power-bi-digital-signage.html">
<link rel="canonical" href="https://swiftdisplay.com/integrations/power-bi-digital-signage.html">
<meta property="og:type" content="article">
<meta property="og:url" content="https://screentinker.com/integrations/power-bi-digital-signage.html">
<meta property="og:url" content="https://swiftdisplay.com/integrations/power-bi-digital-signage.html">
<meta property="og:title" content="Power BI Dashboards on Digital Signage (2026)">
<meta property="og:description" content="Use Publish to web to get an embeddable URL and paste it into ScreenTinker's Webpage widget for a live dashboard on the wall.">
<meta property="og:image" content="https://screentinker.com/assets/dashboard-preview.png">
<meta property="og:site_name" content="ScreenTinker">
<meta property="og:description" content="Use Publish to web to get an embeddable URL and paste it into SwiftDisplay's Webpage widget for a live dashboard on the wall.">
<meta property="og:image" content="https://swiftdisplay.com/assets/dashboard-preview.png">
<meta property="og:site_name" content="SwiftDisplay">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Power BI Dashboards on Digital Signage (2026)">
<meta name="twitter:description" content="Use Publish to web to get an embeddable URL and paste it into ScreenTinker's Webpage widget for a live dashboard on the wall.">
<meta name="twitter:image" content="https://screentinker.com/assets/dashboard-preview.png">
<meta name="twitter:description" content="Use Publish to web to get an embeddable URL and paste it into SwiftDisplay's Webpage widget for a live dashboard on the wall.">
<meta name="twitter:image" content="https://swiftdisplay.com/assets/dashboard-preview.png">
<meta name="theme-color" content="#111827">
<link rel="icon" href="/assets/icon-192.png">
@ -32,7 +32,7 @@
<div class="nav-logo">
<a href="/" style="display:flex;align-items:center;gap:10px">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="2" y="3" width="20" height="14" rx="2"/><line x1="8" y1="21" x2="16" y2="21"/><line x1="12" y1="17" x2="12" y2="21"/></svg>
<span class="nav-logo-text">ScreenTinker</span>
<span class="nav-logo-text">SwiftDisplay</span>
</a>
</div>
<div class="nav-links">
@ -56,17 +56,17 @@
</nav>
<h1>How to put a Power BI dashboard on a digital signage screen</h1>
<p class="lead">ScreenTinker has no dedicated "Power BI app," and it does not need one. Power BI can produce an embeddable public URL with "Publish to web," and ScreenTinker's universal Webpage widget can display that live, self-refreshing report on a wall - as long as you understand the security trade-off first.</p>
<p class="lead">SwiftDisplay has no dedicated "Power BI app," and it does not need one. Power BI can produce an embeddable public URL with "Publish to web," and SwiftDisplay's universal Webpage widget can display that live, self-refreshing report on a wall - as long as you understand the security trade-off first.</p>
<h2>The short version</h2>
<p>In Power BI, use <strong>File &rarr; Embed report &rarr; Publish to web (public)</strong> to generate an embeddable URL, then add a <strong>Webpage</strong> widget in ScreenTinker, paste the URL, add it to a playlist, and assign it to a screen. Because "Publish to web" makes the report <em>public</em>, only do this for non-confidential data.</p>
<p>In Power BI, use <strong>File &rarr; Embed report &rarr; Publish to web (public)</strong> to generate an embeddable URL, then add a <strong>Webpage</strong> widget in SwiftDisplay, paste the URL, add it to a playlist, and assign it to a screen. Because "Publish to web" makes the report <em>public</em>, only do this for non-confidential data.</p>
<h2>Step by step</h2>
<ol>
<li><strong>Open the report</strong> in the Power BI service (app.powerbi.com).</li>
<li><strong>Confirm the data is safe to make public.</strong> "Publish to web" exposes the report to anyone with the link - see the caveat below before continuing.</li>
<li><strong>Choose File &rarr; Embed report &rarr; Publish to web (public).</strong> Create the embed code and copy the <em>link</em> (the standalone URL, not just the <code>&lt;iframe&gt;</code> snippet).</li>
<li><strong>In ScreenTinker, add a Webpage widget.</strong> Create or edit a playlist item and select the <strong>Webpage</strong> widget type.</li>
<li><strong>In SwiftDisplay, add a Webpage widget.</strong> Create or edit a playlist item and select the <strong>Webpage</strong> widget type.</li>
<li><strong>Paste the Publish-to-web URL</strong> into the widget's URL field and save.</li>
<li><strong>Add the widget to a playlist</strong> and set a comfortable on-screen duration.</li>
<li><strong>Assign the playlist to a screen.</strong> The player loads the report and it refreshes on its own schedule.</li>
@ -80,15 +80,15 @@
<li><strong>Publish to web (public)</strong> produces a URL (<code>app.powerbi.com/view?r=...</code>) that anyone can open with no login and that is allowed to be framed. This is the one that works on signage.</li>
<li><strong>Embed (for your organization)</strong> requires each viewer to sign in with a Microsoft Entra / Azure AD account. A signage player has no one to complete that login, so this path generally will <em>not</em> display on an unattended screen - it will show a sign-in wall instead.</li>
</ul>
<p>The underlying reason is the same as every embed: pages that send <code>X-Frame-Options</code> / <code>frame-ancestors</code> to deny framing, or that demand authentication, cannot render in ScreenTinker's Webpage widget (it is an iframe). Publish-to-web is served specifically to be publicly embeddable; the org embed and the normal report URL are not.</p>
<p>The underlying reason is the same as every embed: pages that send <code>X-Frame-Options</code> / <code>frame-ancestors</code> to deny framing, or that demand authentication, cannot render in SwiftDisplay's Webpage widget (it is an iframe). Publish-to-web is served specifically to be publicly embeddable; the org embed and the normal report URL are not.</p>
<h2 style="color:#dc2626">Security caveat: Publish to web makes the report public</h2>
<p>This matters, so it gets its own section. <strong>"Publish to web" exposes your report and its underlying data to anyone who has the link - no authentication, no row-level security, indexable by search engines in some cases.</strong> Do not use it for confidential, personal, financial, or otherwise sensitive data. Many organizations disable Publish to web in the Power BI admin portal for exactly this reason.</p>
<p>If the dashboard contains anything private, do not put it on a public URL. The safer pattern for confidential dashboards is to <a href="/guides/self-hosted-digital-signage.html">self-host ScreenTinker on a trusted LAN</a> and point the Webpage widget at an internal, network-restricted dashboard URL that never leaves your network. Reserve Publish to web for genuinely public metrics - marketing stats, public KPIs, community dashboards, and the like.</p>
<p>If the dashboard contains anything private, do not put it on a public URL. The safer pattern for confidential dashboards is to <a href="/guides/self-hosted-digital-signage.html">self-host SwiftDisplay on a trusted LAN</a> and point the Webpage widget at an internal, network-restricted dashboard URL that never leaves your network. Reserve Publish to web for genuinely public metrics - marketing stats, public KPIs, community dashboards, and the like.</p>
<h2>Auto-refresh tips</h2>
<ul>
<li><strong>Refresh is driven by Power BI, not ScreenTinker.</strong> A Publish-to-web report updates on Power BI's cached schedule (typically about hourly, and roughly every few minutes for visuals in an open view). Design expectations around that cadence rather than expecting real-time.</li>
<li><strong>Refresh is driven by Power BI, not SwiftDisplay.</strong> A Publish-to-web report updates on Power BI's cached schedule (typically about hourly, and roughly every few minutes for visuals in an open view). Design expectations around that cadence rather than expecting real-time.</li>
<li><strong>Match your dataset refresh schedule.</strong> The screen can only be as fresh as the dataset behind it, so set the dataset's scheduled refresh to the fastest cadence your source and license allow.</li>
<li><strong>Reload periodically if needed.</strong> For long-running displays, rotating the report through a playlist (so the widget reloads on each cycle) helps ensure the latest cached view is fetched.</li>
<li><strong>Design for the wall.</strong> Build a report page sized for your display and hide slicers/filters the audience cannot interact with, so the unattended view stays clean.</li>
@ -100,7 +100,7 @@
<p>You probably used the normal report URL or the "Embed for your organization" link, both of which require a Microsoft login. Use <strong>Publish to web (public)</strong> and paste that <code>app.powerbi.com/view?r=...</code> URL instead.</p>
<h3>Is it safe to put a Power BI dashboard on signage?</h3>
<p>Only if the data is non-confidential. "Publish to web" makes the report public to anyone with the link. For private data, self-host ScreenTinker on a trusted LAN and point the Webpage widget at an internal, network-restricted dashboard URL instead.</p>
<p>Only if the data is non-confidential. "Publish to web" makes the report public to anyone with the link. For private data, self-host SwiftDisplay on a trusted LAN and point the Webpage widget at an internal, network-restricted dashboard URL instead.</p>
<h3>Can I use "Embed for your organization" on a screen?</h3>
<p>Generally no. That path requires each viewer to sign in with an organizational account, and an unattended signage player cannot complete that login - it will show a sign-in wall.</p>
@ -109,7 +109,7 @@
<p>On Power BI's cached schedule for Publish-to-web (roughly hourly, with visuals updating every few minutes in an open view), and never fresher than the dataset's own scheduled refresh.</p>
<h3>Is there a native Power BI widget?</h3>
<p>No - this uses the universal Webpage widget with a Publish-to-web URL. That is the supported way to show Power BI on ScreenTinker.</p>
<p>No - this uses the universal Webpage widget with a Publish-to-web URL. That is the supported way to show Power BI on SwiftDisplay.</p>
<div class="related">
<h2>Related guides</h2>
@ -123,17 +123,17 @@
</div>
<div class="cta">
<h2>Try ScreenTinker free</h2>
<h2>Try SwiftDisplay free</h2>
<p>Add a Webpage widget, paste a Publish-to-web URL, and see your dashboard on a screen in minutes. Free plan, no credit card required.</p>
<a href="/app#/login" class="btn btn-primary" style="padding:14px 28px;font-size:16px">Start Free</a>
<a href="https://github.com/screentinker/screentinker" target="_blank" rel="noopener" class="btn btn-outline" style="padding:14px 28px;font-size:16px;margin-left:12px">View on GitHub</a>
<a href="https://github.com/swiftdisplay/swiftdisplay" target="_blank" rel="noopener" class="btn btn-outline" style="padding:14px 28px;font-size:16px;margin-left:12px">View on GitHub</a>
</div>
</main>
<footer>
<div style="color:var(--dim);font-size:13px">&copy; 2026 ScreenTinker. All rights reserved.</div>
<div style="color:var(--dim);font-size:13px">&copy; 2026 SwiftDisplay. All rights reserved.</div>
<div class="links">
<a href="https://github.com/screentinker/screentinker" target="_blank" rel="noopener">GitHub</a>
<a href="https://github.com/swiftdisplay/swiftdisplay" target="_blank" rel="noopener">GitHub</a>
<a href="https://discord.gg/utTdsrqq4Z" target="_blank" rel="noopener">Discord</a>
<a href="/legal/terms.html">Terms</a>
<a href="/legal/privacy.html">Privacy</a>
@ -147,9 +147,9 @@
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{ "@type": "ListItem", "position": 1, "name": "Home", "item": "https://screentinker.com/" },
{ "@type": "ListItem", "position": 2, "name": "Integrations", "item": "https://screentinker.com/integrations/" },
{ "@type": "ListItem", "position": 3, "name": "Power BI", "item": "https://screentinker.com/integrations/power-bi-digital-signage.html" }
{ "@type": "ListItem", "position": 1, "name": "Home", "item": "https://swiftdisplay.com/" },
{ "@type": "ListItem", "position": 2, "name": "Integrations", "item": "https://swiftdisplay.com/integrations/" },
{ "@type": "ListItem", "position": 3, "name": "Power BI", "item": "https://swiftdisplay.com/integrations/power-bi-digital-signage.html" }
]
}
</script>
@ -159,10 +159,10 @@
"@type": "FAQPage",
"mainEntity": [
{ "@type": "Question", "name": "Why won't my Power BI report show up on the screen?", "acceptedAnswer": { "@type": "Answer", "text": "You probably used the normal report URL or the Embed for your organization link, both of which require a Microsoft login. Use Publish to web (public) and paste that app.powerbi.com/view?r=... URL instead." } },
{ "@type": "Question", "name": "Is it safe to put a Power BI dashboard on signage?", "acceptedAnswer": { "@type": "Answer", "text": "Only if the data is non-confidential. Publish to web makes the report public to anyone with the link. For private data, self-host ScreenTinker on a trusted LAN and point the Webpage widget at an internal, network-restricted dashboard URL instead." } },
{ "@type": "Question", "name": "Is it safe to put a Power BI dashboard on signage?", "acceptedAnswer": { "@type": "Answer", "text": "Only if the data is non-confidential. Publish to web makes the report public to anyone with the link. For private data, self-host SwiftDisplay on a trusted LAN and point the Webpage widget at an internal, network-restricted dashboard URL instead." } },
{ "@type": "Question", "name": "Can I use Embed for your organization on a screen?", "acceptedAnswer": { "@type": "Answer", "text": "Generally no. That path requires each viewer to sign in with an organizational account, and an unattended signage player cannot complete that login - it will show a sign-in wall." } },
{ "@type": "Question", "name": "How often does the dashboard refresh?", "acceptedAnswer": { "@type": "Answer", "text": "On Power BI's cached schedule for Publish-to-web (roughly hourly, with visuals updating every few minutes in an open view), and never fresher than the dataset's own scheduled refresh." } },
{ "@type": "Question", "name": "Is there a native Power BI widget?", "acceptedAnswer": { "@type": "Answer", "text": "No - this uses the universal Webpage widget with a Publish-to-web URL. That is the supported way to show Power BI on ScreenTinker." } }
{ "@type": "Question", "name": "Is there a native Power BI widget?", "acceptedAnswer": { "@type": "Answer", "text": "No - this uses the universal Webpage widget with a Publish-to-web URL. That is the supported way to show Power BI on SwiftDisplay." } }
]
}
</script>

View file

@ -3,23 +3,23 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>RSS Feeds on Digital Signage - News Tickers (2026) | ScreenTinker</title>
<meta name="description" content="Show live RSS headlines on your digital signage with ScreenTinker's native RSS widget. Build news tickers, blog headlines, and status boards. Free and open source.">
<title>RSS Feeds on Digital Signage - News Tickers (2026) | SwiftDisplay</title>
<meta name="description" content="Show live RSS headlines on your digital signage with SwiftDisplay's native RSS widget. Build news tickers, blog headlines, and status boards. Free and open source.">
<meta name="keywords" content="rss digital signage, rss ticker signage, news ticker digital signage, rss feed on tv, headlines digital signage, rss widget signage">
<meta name="robots" content="index, follow">
<link rel="canonical" href="https://screentinker.com/integrations/rss-digital-signage.html">
<link rel="canonical" href="https://swiftdisplay.com/integrations/rss-digital-signage.html">
<meta property="og:type" content="article">
<meta property="og:url" content="https://screentinker.com/integrations/rss-digital-signage.html">
<meta property="og:url" content="https://swiftdisplay.com/integrations/rss-digital-signage.html">
<meta property="og:title" content="RSS Feeds on Digital Signage - News Tickers (2026)">
<meta property="og:description" content="Show live RSS headlines on your screens with ScreenTinker's native RSS widget. Build news tickers and status boards.">
<meta property="og:image" content="https://screentinker.com/assets/dashboard-preview.png">
<meta property="og:site_name" content="ScreenTinker">
<meta property="og:description" content="Show live RSS headlines on your screens with SwiftDisplay's native RSS widget. Build news tickers and status boards.">
<meta property="og:image" content="https://swiftdisplay.com/assets/dashboard-preview.png">
<meta property="og:site_name" content="SwiftDisplay">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="RSS Feeds on Digital Signage - News Tickers (2026)">
<meta name="twitter:description" content="Show live RSS headlines on your screens with ScreenTinker's native RSS widget. Build news tickers and status boards.">
<meta name="twitter:image" content="https://screentinker.com/assets/dashboard-preview.png">
<meta name="twitter:description" content="Show live RSS headlines on your screens with SwiftDisplay's native RSS widget. Build news tickers and status boards.">
<meta name="twitter:image" content="https://swiftdisplay.com/assets/dashboard-preview.png">
<meta name="theme-color" content="#111827">
<link rel="icon" href="/assets/icon-192.png">
@ -32,7 +32,7 @@
<div class="nav-logo">
<a href="/" style="display:flex;align-items:center;gap:10px">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="2" y="3" width="20" height="14" rx="2"/><line x1="8" y1="21" x2="16" y2="21"/><line x1="12" y1="17" x2="12" y2="21"/></svg>
<span class="nav-logo-text">ScreenTinker</span>
<span class="nav-logo-text">SwiftDisplay</span>
</a>
</div>
<div class="nav-links">
@ -56,14 +56,14 @@
</nav>
<h1>RSS Feeds on Digital Signage: News Tickers &amp; Headlines</h1>
<p class="lead">ScreenTinker has a native RSS widget. Point it at a feed URL and it renders live headlines on screen - perfect for a news ticker, blog headlines, or an internal announcement board.</p>
<p class="lead">SwiftDisplay has a native RSS widget. Point it at a feed URL and it renders live headlines on screen - perfect for a news ticker, blog headlines, or an internal announcement board.</p>
<h2>The short version</h2>
<p>The RSS widget is built in - no plugins or embeds. You give it a feed URL like <code>https://example.com/feed.xml</code> and it pulls the latest items and renders the headlines on screen. Because it is a configurable widget, you can add it to playlists and layouts, and it can share a multi-zone layout with your main content so headlines run alongside images or video.</p>
<h2>Step by step</h2>
<ol>
<li>Open the <strong>Content Library</strong> (or the layout editor) in your ScreenTinker dashboard.</li>
<li>Open the <strong>Content Library</strong> (or the layout editor) in your SwiftDisplay dashboard.</li>
<li>Add the <strong>RSS</strong> widget.</li>
<li>Configure it with your feed URL, for example <code>https://example.com/feed.xml</code>. The widget fetches the feed and renders the current headlines.</li>
<li>Add the RSS widget to a <strong>Playlist</strong>, or place it in a zone of a multi-zone <strong>layout</strong> next to your other content.</li>
@ -82,7 +82,7 @@
<h2>FAQ</h2>
<h3>Is the RSS widget really built in?</h3>
<p>Yes. RSS is a native ScreenTinker widget - you configure a feed URL and it renders headlines. There is no third-party plugin or embed code to manage.</p>
<p>Yes. RSS is a native SwiftDisplay widget - you configure a feed URL and it renders headlines. There is no third-party plugin or embed code to manage.</p>
<h3>What kind of feed URL do I use?</h3>
<p>A standard RSS or Atom feed URL, such as <code>https://example.com/feed.xml</code>. Most blogs, news sites, CMSes, and status pages publish one.</p>
@ -93,13 +93,13 @@
<h3>Can I use an internal or private feed?</h3>
<p>The widget fetches a feed URL, so any feed the player can reach works - including an internal feed on your network for a self-hosted deployment. Publish your announcements as RSS and point the widget at that URL.</p>
<h3>Does it work on all ScreenTinker players?</h3>
<h3>Does it work on all SwiftDisplay players?</h3>
<p>Yes. The RSS widget runs on Android TV, Fire TV, Tizen, webOS, Vega, Raspberry Pi, Windows, ChromeOS, and the browser player - all free.</p>
<div class="related">
<h2>Related integrations &amp; guides</h2>
<ul>
<li><a href="/integrations/">All ScreenTinker integrations</a></li>
<li><a href="/integrations/">All SwiftDisplay integrations</a></li>
<li><a href="/integrations/youtube-digital-signage.html">How to display YouTube videos on digital signage</a></li>
<li><a href="/integrations/weather-digital-signage.html">Weather widget for digital signage</a></li>
<li><a href="/guides/what-is-digital-signage.html">What is digital signage?</a></li>
@ -111,14 +111,14 @@
<h2>Ready to put headlines on your screens?</h2>
<p>Free plan supports 1 device. Self-host it free, or start on the cloud in minutes.</p>
<a href="/app#/login" class="btn btn-primary" style="padding:14px 28px;font-size:16px">Start Free</a>
<a href="https://github.com/screentinker/screentinker" target="_blank" rel="noopener" class="btn btn-outline" style="padding:14px 28px;font-size:16px;margin-left:12px">View on GitHub</a>
<a href="https://github.com/swiftdisplay/swiftdisplay" target="_blank" rel="noopener" class="btn btn-outline" style="padding:14px 28px;font-size:16px;margin-left:12px">View on GitHub</a>
</div>
</main>
<footer>
<div style="color:var(--dim);font-size:13px">&copy; 2026 ScreenTinker. All rights reserved.</div>
<div style="color:var(--dim);font-size:13px">&copy; 2026 SwiftDisplay. All rights reserved.</div>
<div class="links">
<a href="https://github.com/screentinker/screentinker" target="_blank" rel="noopener">GitHub</a>
<a href="https://github.com/swiftdisplay/swiftdisplay" target="_blank" rel="noopener">GitHub</a>
<a href="https://discord.gg/utTdsrqq4Z" target="_blank" rel="noopener">Discord</a>
<a href="/legal/terms.html">Terms</a>
<a href="/legal/privacy.html">Privacy</a>
@ -132,9 +132,9 @@
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{ "@type": "ListItem", "position": 1, "name": "Home", "item": "https://screentinker.com/" },
{ "@type": "ListItem", "position": 2, "name": "Integrations", "item": "https://screentinker.com/integrations/" },
{ "@type": "ListItem", "position": 3, "name": "RSS on Digital Signage", "item": "https://screentinker.com/integrations/rss-digital-signage.html" }
{ "@type": "ListItem", "position": 1, "name": "Home", "item": "https://swiftdisplay.com/" },
{ "@type": "ListItem", "position": 2, "name": "Integrations", "item": "https://swiftdisplay.com/integrations/" },
{ "@type": "ListItem", "position": 3, "name": "RSS on Digital Signage", "item": "https://swiftdisplay.com/integrations/rss-digital-signage.html" }
]
}
</script>
@ -143,11 +143,11 @@
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{ "@type": "Question", "name": "Is the RSS widget really built in?", "acceptedAnswer": { "@type": "Answer", "text": "Yes. RSS is a native ScreenTinker widget - you configure a feed URL and it renders headlines. There is no third-party plugin or embed code to manage." } },
{ "@type": "Question", "name": "Is the RSS widget really built in?", "acceptedAnswer": { "@type": "Answer", "text": "Yes. RSS is a native SwiftDisplay widget - you configure a feed URL and it renders headlines. There is no third-party plugin or embed code to manage." } },
{ "@type": "Question", "name": "What kind of feed URL do I use?", "acceptedAnswer": { "@type": "Answer", "text": "A standard RSS or Atom feed URL, such as https://example.com/feed.xml. Most blogs, news sites, CMSes, and status pages publish one." } },
{ "@type": "Question", "name": "Can the RSS ticker share the screen with other content?", "acceptedAnswer": { "@type": "Answer", "text": "Yes. Place the RSS widget in one zone of a multi-zone layout and your main content in another. Headlines and your primary message then display at the same time." } },
{ "@type": "Question", "name": "Can I use an internal or private feed?", "acceptedAnswer": { "@type": "Answer", "text": "The widget fetches a feed URL, so any feed the player can reach works - including an internal feed on your network for a self-hosted deployment. Publish your announcements as RSS and point the widget at that URL." } },
{ "@type": "Question", "name": "Does it work on all ScreenTinker players?", "acceptedAnswer": { "@type": "Answer", "text": "Yes. The RSS widget runs on Android TV, Fire TV, Tizen, webOS, Vega, Raspberry Pi, Windows, ChromeOS, and the browser player - all free." } }
{ "@type": "Question", "name": "Does it work on all SwiftDisplay players?", "acceptedAnswer": { "@type": "Answer", "text": "Yes. The RSS widget runs on Android TV, Fire TV, Tizen, webOS, Vega, Raspberry Pi, Windows, ChromeOS, and the browser player - all free." } }
]
}
</script>

View file

@ -3,23 +3,23 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Weather Widget for Digital Signage (2026) | ScreenTinker</title>
<meta name="description" content="Show current weather on your digital signage with ScreenTinker's native weather widget. Set a location and timezone, pair it with a clock in a lobby layout. Free and open source.">
<title>Weather Widget for Digital Signage (2026) | SwiftDisplay</title>
<meta name="description" content="Show current weather on your digital signage with SwiftDisplay's native weather widget. Set a location and timezone, pair it with a clock in a lobby layout. Free and open source.">
<meta name="keywords" content="weather digital signage, weather widget signage, weather on tv signage, lobby weather display, digital signage weather clock, weather board signage">
<meta name="robots" content="index, follow">
<link rel="canonical" href="https://screentinker.com/integrations/weather-digital-signage.html">
<link rel="canonical" href="https://swiftdisplay.com/integrations/weather-digital-signage.html">
<meta property="og:type" content="article">
<meta property="og:url" content="https://screentinker.com/integrations/weather-digital-signage.html">
<meta property="og:url" content="https://swiftdisplay.com/integrations/weather-digital-signage.html">
<meta property="og:title" content="Weather Widget for Digital Signage (2026)">
<meta property="og:description" content="Show current weather on your screens with ScreenTinker's native weather widget. Set a location, pair it with a clock in a lobby layout.">
<meta property="og:image" content="https://screentinker.com/assets/dashboard-preview.png">
<meta property="og:site_name" content="ScreenTinker">
<meta property="og:description" content="Show current weather on your screens with SwiftDisplay's native weather widget. Set a location, pair it with a clock in a lobby layout.">
<meta property="og:image" content="https://swiftdisplay.com/assets/dashboard-preview.png">
<meta property="og:site_name" content="SwiftDisplay">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Weather Widget for Digital Signage (2026)">
<meta name="twitter:description" content="Show current weather on your screens with ScreenTinker's native weather widget. Set a location, pair it with a clock in a lobby layout.">
<meta name="twitter:image" content="https://screentinker.com/assets/dashboard-preview.png">
<meta name="twitter:description" content="Show current weather on your screens with SwiftDisplay's native weather widget. Set a location, pair it with a clock in a lobby layout.">
<meta name="twitter:image" content="https://swiftdisplay.com/assets/dashboard-preview.png">
<meta name="theme-color" content="#111827">
<link rel="icon" href="/assets/icon-192.png">
@ -32,7 +32,7 @@
<div class="nav-logo">
<a href="/" style="display:flex;align-items:center;gap:10px">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="2" y="3" width="20" height="14" rx="2"/><line x1="8" y1="21" x2="16" y2="21"/><line x1="12" y1="17" x2="12" y2="21"/></svg>
<span class="nav-logo-text">ScreenTinker</span>
<span class="nav-logo-text">SwiftDisplay</span>
</a>
</div>
<div class="nav-links">
@ -56,14 +56,14 @@
</nav>
<h1>Weather Widget for Digital Signage</h1>
<p class="lead">ScreenTinker has a native weather widget. Set a location, optionally a timezone, and it shows current conditions on screen - a lobby-board staple next to a clock and your main content.</p>
<p class="lead">SwiftDisplay has a native weather widget. Set a location, optionally a timezone, and it shows current conditions on screen - a lobby-board staple next to a clock and your main content.</p>
<h2>The short version</h2>
<p>The weather widget is built in. You configure a location and, if you want, a timezone, and it renders current conditions on the display. It is most often placed in a multi-zone layout alongside a clock and a main content area to make a clean reception or lobby board.</p>
<h2>Step by step</h2>
<ol>
<li>Open the <strong>Content Library</strong> (or the layout editor) in your ScreenTinker dashboard.</li>
<li>Open the <strong>Content Library</strong> (or the layout editor) in your SwiftDisplay dashboard.</li>
<li>Add the <strong>Weather</strong> widget.</li>
<li>Configure it with your <strong>location</strong>, and optionally set a <strong>timezone</strong>. The widget renders current conditions for that location.</li>
<li>Add the widget to a <strong>Playlist</strong>, or place it in a zone of a multi-zone <strong>layout</strong> next to a clock and your main content.</li>
@ -72,7 +72,7 @@
<h2>Tips &amp; use cases</h2>
<ul>
<li><strong>Pair it with a Clock.</strong> ScreenTinker's native Clock widget plus the weather widget is the classic lobby combo - people glance up for the time and today's conditions.</li>
<li><strong>Pair it with a Clock.</strong> SwiftDisplay's native Clock widget plus the weather widget is the classic lobby combo - people glance up for the time and today's conditions.</li>
<li><strong>Reception and lobby boards.</strong> A multi-zone layout with weather in a corner, a clock, and a main zone for announcements or a welcome message makes a polished front-of-house display.</li>
<li><strong>Set the location correctly.</strong> Configure the location for where the screen physically lives so staff and visitors see local conditions.</li>
<li><strong>Set the timezone when it matters.</strong> If you run screens across regions, set the timezone so a paired clock and any time-based content line up with the local site.</li>
@ -82,7 +82,7 @@
<h2>FAQ</h2>
<h3>Is the weather widget built in?</h3>
<p>Yes. Weather is a native ScreenTinker widget. You configure a location (and optionally a timezone) and it renders current conditions - no third-party embed required.</p>
<p>Yes. Weather is a native SwiftDisplay widget. You configure a location (and optionally a timezone) and it renders current conditions - no third-party embed required.</p>
<h3>What do I configure?</h3>
<p>A location, and optionally a timezone. That is enough for the widget to show current conditions on screen.</p>
@ -93,13 +93,13 @@
<h3>Can I show different weather on different screens?</h3>
<p>Yes. Configure a layout per location with that site's location set, then assign each layout to the screens at that site.</p>
<h3>Does it work on all ScreenTinker players?</h3>
<h3>Does it work on all SwiftDisplay players?</h3>
<p>Yes. The weather widget runs on Android TV, Fire TV, Tizen, webOS, Vega, Raspberry Pi, Windows, ChromeOS, and the browser player - all free.</p>
<div class="related">
<h2>Related integrations &amp; guides</h2>
<ul>
<li><a href="/integrations/">All ScreenTinker integrations</a></li>
<li><a href="/integrations/">All SwiftDisplay integrations</a></li>
<li><a href="/integrations/youtube-digital-signage.html">How to display YouTube videos on digital signage</a></li>
<li><a href="/integrations/rss-digital-signage.html">RSS feeds on digital signage: news tickers &amp; headlines</a></li>
<li><a href="/guides/what-is-digital-signage.html">What is digital signage?</a></li>
@ -111,14 +111,14 @@
<h2>Ready to build a lobby board?</h2>
<p>Free plan supports 1 device. Self-host it free, or start on the cloud in minutes.</p>
<a href="/app#/login" class="btn btn-primary" style="padding:14px 28px;font-size:16px">Start Free</a>
<a href="https://github.com/screentinker/screentinker" target="_blank" rel="noopener" class="btn btn-outline" style="padding:14px 28px;font-size:16px;margin-left:12px">View on GitHub</a>
<a href="https://github.com/swiftdisplay/swiftdisplay" target="_blank" rel="noopener" class="btn btn-outline" style="padding:14px 28px;font-size:16px;margin-left:12px">View on GitHub</a>
</div>
</main>
<footer>
<div style="color:var(--dim);font-size:13px">&copy; 2026 ScreenTinker. All rights reserved.</div>
<div style="color:var(--dim);font-size:13px">&copy; 2026 SwiftDisplay. All rights reserved.</div>
<div class="links">
<a href="https://github.com/screentinker/screentinker" target="_blank" rel="noopener">GitHub</a>
<a href="https://github.com/swiftdisplay/swiftdisplay" target="_blank" rel="noopener">GitHub</a>
<a href="https://discord.gg/utTdsrqq4Z" target="_blank" rel="noopener">Discord</a>
<a href="/legal/terms.html">Terms</a>
<a href="/legal/privacy.html">Privacy</a>
@ -132,9 +132,9 @@
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{ "@type": "ListItem", "position": 1, "name": "Home", "item": "https://screentinker.com/" },
{ "@type": "ListItem", "position": 2, "name": "Integrations", "item": "https://screentinker.com/integrations/" },
{ "@type": "ListItem", "position": 3, "name": "Weather on Digital Signage", "item": "https://screentinker.com/integrations/weather-digital-signage.html" }
{ "@type": "ListItem", "position": 1, "name": "Home", "item": "https://swiftdisplay.com/" },
{ "@type": "ListItem", "position": 2, "name": "Integrations", "item": "https://swiftdisplay.com/integrations/" },
{ "@type": "ListItem", "position": 3, "name": "Weather on Digital Signage", "item": "https://swiftdisplay.com/integrations/weather-digital-signage.html" }
]
}
</script>
@ -143,11 +143,11 @@
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{ "@type": "Question", "name": "Is the weather widget built in?", "acceptedAnswer": { "@type": "Answer", "text": "Yes. Weather is a native ScreenTinker widget. You configure a location (and optionally a timezone) and it renders current conditions - no third-party embed required." } },
{ "@type": "Question", "name": "Is the weather widget built in?", "acceptedAnswer": { "@type": "Answer", "text": "Yes. Weather is a native SwiftDisplay widget. You configure a location (and optionally a timezone) and it renders current conditions - no third-party embed required." } },
{ "@type": "Question", "name": "What do I configure?", "acceptedAnswer": { "@type": "Answer", "text": "A location, and optionally a timezone. That is enough for the widget to show current conditions on screen." } },
{ "@type": "Question", "name": "Can I show weather and a clock together?", "acceptedAnswer": { "@type": "Answer", "text": "Yes. The Clock is also a native widget. Put both into a multi-zone layout - weather in one zone, clock in another, main content in a third - for a lobby or reception board." } },
{ "@type": "Question", "name": "Can I show different weather on different screens?", "acceptedAnswer": { "@type": "Answer", "text": "Yes. Configure a layout per location with that site's location set, then assign each layout to the screens at that site." } },
{ "@type": "Question", "name": "Does it work on all ScreenTinker players?", "acceptedAnswer": { "@type": "Answer", "text": "Yes. The weather widget runs on Android TV, Fire TV, Tizen, webOS, Vega, Raspberry Pi, Windows, ChromeOS, and the browser player - all free." } }
{ "@type": "Question", "name": "Does it work on all SwiftDisplay players?", "acceptedAnswer": { "@type": "Answer", "text": "Yes. The weather widget runs on Android TV, Fire TV, Tizen, webOS, Vega, Raspberry Pi, Windows, ChromeOS, and the browser player - all free." } }
]
}
</script>

View file

@ -3,23 +3,23 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>How to Display YouTube on Digital Signage (2026) | ScreenTinker</title>
<meta name="description" content="Play YouTube videos on your digital signage screens with ScreenTinker's native YouTube widget. Paste a URL, add it to a playlist, schedule it. Free and open source.">
<title>How to Display YouTube on Digital Signage (2026) | SwiftDisplay</title>
<meta name="description" content="Play YouTube videos on your digital signage screens with SwiftDisplay's native YouTube widget. Paste a URL, add it to a playlist, schedule it. Free and open source.">
<meta name="keywords" content="youtube digital signage, youtube on signage, play youtube on tv signage, youtube video signage, youtube widget signage, loop youtube signage">
<meta name="robots" content="index, follow">
<link rel="canonical" href="https://screentinker.com/integrations/youtube-digital-signage.html">
<link rel="canonical" href="https://swiftdisplay.com/integrations/youtube-digital-signage.html">
<meta property="og:type" content="article">
<meta property="og:url" content="https://screentinker.com/integrations/youtube-digital-signage.html">
<meta property="og:url" content="https://swiftdisplay.com/integrations/youtube-digital-signage.html">
<meta property="og:title" content="How to Display YouTube on Digital Signage (2026)">
<meta property="og:description" content="Play YouTube videos on your signage screens with ScreenTinker's native YouTube widget. Paste a URL, schedule it, done.">
<meta property="og:image" content="https://screentinker.com/assets/dashboard-preview.png">
<meta property="og:site_name" content="ScreenTinker">
<meta property="og:description" content="Play YouTube videos on your signage screens with SwiftDisplay's native YouTube widget. Paste a URL, schedule it, done.">
<meta property="og:image" content="https://swiftdisplay.com/assets/dashboard-preview.png">
<meta property="og:site_name" content="SwiftDisplay">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="How to Display YouTube on Digital Signage (2026)">
<meta name="twitter:description" content="Play YouTube videos on your signage screens with ScreenTinker's native YouTube widget. Paste a URL, schedule it, done.">
<meta name="twitter:image" content="https://screentinker.com/assets/dashboard-preview.png">
<meta name="twitter:description" content="Play YouTube videos on your signage screens with SwiftDisplay's native YouTube widget. Paste a URL, schedule it, done.">
<meta name="twitter:image" content="https://swiftdisplay.com/assets/dashboard-preview.png">
<meta name="theme-color" content="#111827">
<link rel="icon" href="/assets/icon-192.png">
@ -32,7 +32,7 @@
<div class="nav-logo">
<a href="/" style="display:flex;align-items:center;gap:10px">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="2" y="3" width="20" height="14" rx="2"/><line x1="8" y1="21" x2="16" y2="21"/><line x1="12" y1="17" x2="12" y2="21"/></svg>
<span class="nav-logo-text">ScreenTinker</span>
<span class="nav-logo-text">SwiftDisplay</span>
</a>
</div>
<div class="nav-links">
@ -56,14 +56,14 @@
</nav>
<h1>How to Display YouTube Videos on Digital Signage</h1>
<p class="lead">YouTube is a built-in content type in ScreenTinker. Paste a video URL, give it a name, and it plays on your screens like any other media - no embed code, no browser hacks.</p>
<p class="lead">YouTube is a built-in content type in SwiftDisplay. Paste a video URL, give it a name, and it plays on your screens like any other media - no embed code, no browser hacks.</p>
<h2>The short version</h2>
<p>ScreenTinker has a native YouTube widget, so you do not need to download videos or wire up a browser workaround. In the Content Library you choose <strong>Add YouTube</strong>, paste the video URL, give it a name, and it becomes a library item you can drop into any playlist, schedule, and assign to screens. On the display it plays muted (browser autoplay policy) using YouTube's iframe player.</p>
<p>SwiftDisplay has a native YouTube widget, so you do not need to download videos or wire up a browser workaround. In the Content Library you choose <strong>Add YouTube</strong>, paste the video URL, give it a name, and it becomes a library item you can drop into any playlist, schedule, and assign to screens. On the display it plays muted (browser autoplay policy) using YouTube's iframe player.</p>
<h2>Step by step</h2>
<ol>
<li>Open the <strong>Content Library</strong> in your ScreenTinker dashboard.</li>
<li>Open the <strong>Content Library</strong> in your SwiftDisplay dashboard.</li>
<li>Click <strong>Add YouTube</strong> and paste the YouTube video URL (for example <code>https://www.youtube.com/watch?v=...</code>).</li>
<li>Give the item a name so you can find it later - something like "Brand reel" or "Product loop."</li>
<li>Save it. The video now appears in your library alongside images and uploaded video. The dashboard preview plays it muted so autoplay works.</li>
@ -83,7 +83,7 @@
<h2>FAQ</h2>
<h3>Do I need to download the YouTube video first?</h3>
<p>No. The YouTube widget is native - you paste the video URL and ScreenTinker's player streams it through YouTube's iframe player. There is nothing to download or re-upload.</p>
<p>No. The YouTube widget is native - you paste the video URL and SwiftDisplay's player streams it through YouTube's iframe player. There is nothing to download or re-upload.</p>
<h3>Why does the video play without sound?</h3>
<p>Browsers require muted playback for autoplay to work reliably, so YouTube content plays muted on the display and in the dashboard preview. Choose videos that work as silent visuals or that have burned-in captions.</p>
@ -92,15 +92,15 @@
<p>Yes. Put the YouTube item in a playlist on its own (or with a short rotation) and assign that playlist to the screen. The playlist repeats, so the video loops.</p>
<h3>Can I schedule YouTube content to specific times?</h3>
<p>Yes. YouTube items schedule exactly like images and uploaded video - assign the playlist to a daypart or specific screens using ScreenTinker's scheduling.</p>
<p>Yes. YouTube items schedule exactly like images and uploaded video - assign the playlist to a daypart or specific screens using SwiftDisplay's scheduling.</p>
<h3>Does this work on every player?</h3>
<p>The YouTube widget works on ScreenTinker's players - Android TV, Fire TV, Tizen, webOS, Vega, Raspberry Pi, Windows, ChromeOS, and the browser player - all free.</p>
<p>The YouTube widget works on SwiftDisplay's players - Android TV, Fire TV, Tizen, webOS, Vega, Raspberry Pi, Windows, ChromeOS, and the browser player - all free.</p>
<div class="related">
<h2>Related integrations &amp; guides</h2>
<ul>
<li><a href="/integrations/">All ScreenTinker integrations</a></li>
<li><a href="/integrations/">All SwiftDisplay integrations</a></li>
<li><a href="/integrations/rss-digital-signage.html">RSS feeds on digital signage: news tickers &amp; headlines</a></li>
<li><a href="/integrations/weather-digital-signage.html">Weather widget for digital signage</a></li>
<li><a href="/guides/what-is-digital-signage.html">What is digital signage?</a></li>
@ -112,14 +112,14 @@
<h2>Ready to put YouTube on your screens?</h2>
<p>Free plan supports 1 device. Self-host it free, or start on the cloud in minutes.</p>
<a href="/app#/login" class="btn btn-primary" style="padding:14px 28px;font-size:16px">Start Free</a>
<a href="https://github.com/screentinker/screentinker" target="_blank" rel="noopener" class="btn btn-outline" style="padding:14px 28px;font-size:16px;margin-left:12px">View on GitHub</a>
<a href="https://github.com/swiftdisplay/swiftdisplay" target="_blank" rel="noopener" class="btn btn-outline" style="padding:14px 28px;font-size:16px;margin-left:12px">View on GitHub</a>
</div>
</main>
<footer>
<div style="color:var(--dim);font-size:13px">&copy; 2026 ScreenTinker. All rights reserved.</div>
<div style="color:var(--dim);font-size:13px">&copy; 2026 SwiftDisplay. All rights reserved.</div>
<div class="links">
<a href="https://github.com/screentinker/screentinker" target="_blank" rel="noopener">GitHub</a>
<a href="https://github.com/swiftdisplay/swiftdisplay" target="_blank" rel="noopener">GitHub</a>
<a href="https://discord.gg/utTdsrqq4Z" target="_blank" rel="noopener">Discord</a>
<a href="/legal/terms.html">Terms</a>
<a href="/legal/privacy.html">Privacy</a>
@ -133,9 +133,9 @@
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{ "@type": "ListItem", "position": 1, "name": "Home", "item": "https://screentinker.com/" },
{ "@type": "ListItem", "position": 2, "name": "Integrations", "item": "https://screentinker.com/integrations/" },
{ "@type": "ListItem", "position": 3, "name": "YouTube on Digital Signage", "item": "https://screentinker.com/integrations/youtube-digital-signage.html" }
{ "@type": "ListItem", "position": 1, "name": "Home", "item": "https://swiftdisplay.com/" },
{ "@type": "ListItem", "position": 2, "name": "Integrations", "item": "https://swiftdisplay.com/integrations/" },
{ "@type": "ListItem", "position": 3, "name": "YouTube on Digital Signage", "item": "https://swiftdisplay.com/integrations/youtube-digital-signage.html" }
]
}
</script>
@ -144,11 +144,11 @@
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{ "@type": "Question", "name": "Do I need to download the YouTube video first?", "acceptedAnswer": { "@type": "Answer", "text": "No. The YouTube widget is native - you paste the video URL and ScreenTinker's player streams it through YouTube's iframe player. There is nothing to download or re-upload." } },
{ "@type": "Question", "name": "Do I need to download the YouTube video first?", "acceptedAnswer": { "@type": "Answer", "text": "No. The YouTube widget is native - you paste the video URL and SwiftDisplay's player streams it through YouTube's iframe player. There is nothing to download or re-upload." } },
{ "@type": "Question", "name": "Why does the video play without sound?", "acceptedAnswer": { "@type": "Answer", "text": "Browsers require muted playback for autoplay to work reliably, so YouTube content plays muted on the display and in the dashboard preview. Choose videos that work as silent visuals or that have burned-in captions." } },
{ "@type": "Question", "name": "Can I loop a single YouTube video all day?", "acceptedAnswer": { "@type": "Answer", "text": "Yes. Put the YouTube item in a playlist on its own (or with a short rotation) and assign that playlist to the screen. The playlist repeats, so the video loops." } },
{ "@type": "Question", "name": "Can I schedule YouTube content to specific times?", "acceptedAnswer": { "@type": "Answer", "text": "Yes. YouTube items schedule exactly like images and uploaded video - assign the playlist to a daypart or specific screens using ScreenTinker's scheduling." } },
{ "@type": "Question", "name": "Does this work on every player?", "acceptedAnswer": { "@type": "Answer", "text": "The YouTube widget works on ScreenTinker's players - Android TV, Fire TV, Tizen, webOS, Vega, Raspberry Pi, Windows, ChromeOS, and the browser player - all free." } }
{ "@type": "Question", "name": "Can I schedule YouTube content to specific times?", "acceptedAnswer": { "@type": "Answer", "text": "Yes. YouTube items schedule exactly like images and uploaded video - assign the playlist to a daypart or specific screens using SwiftDisplay's scheduling." } },
{ "@type": "Question", "name": "Does this work on every player?", "acceptedAnswer": { "@type": "Answer", "text": "The YouTube widget works on SwiftDisplay's players - Android TV, Fire TV, Tizen, webOS, Vega, Raspberry Pi, Windows, ChromeOS, and the browser player - all free." } }
]
}
</script>

View file

@ -1,7 +1,7 @@
// Render-blocking branding primer (#38). Loaded as a synchronous same-origin
// <script> right after the sidebar logo, so it runs DURING parse, before first
// paint — applying the current workspace's CACHED white-label so the page paints
// branded instead of flashing the "ScreenTinker" default. branding.js then
// branded instead of flashing the "SwiftDisplay" default. branding.js then
// refreshes it from the server and re-writes the cache. Plain script (not a
// module) so it's not deferred; keyed by workspace so a switch shows the right
// brand (or the neutral default for a workspace we haven't cached yet).
@ -19,7 +19,7 @@
if (!wl) {
// #76: no per-workspace cache yet (e.g. a never-visited org). Fall back to
// the server-injected instance / custom-domain branding so the page paints
// the configured brand instead of flashing the ScreenTinker default;
// the configured brand instead of flashing the SwiftDisplay default;
// branding.js then fetches and caches the workspace-specific brand.
try {
var ssr = document.querySelector('meta[name="ssr-brand"]');

View file

@ -1,7 +1,7 @@
// Applies the current user's saved white-label config to the DOM.
// Runs once after login/route bootstrap. Without this, saved values in the
// white_labels table are read into the Settings form but never applied to
// the actual page — so users see "ScreenTinker" and default colors after
// the actual page — so users see "SwiftDisplay" and default colors after
// every reload, as if their save reverted.
let applied = false;

View file

@ -89,7 +89,7 @@ export default {
'dashboard.total_displays': 'Bildschirme gesamt',
'dashboard.ungrouped': 'Nicht gruppiert',
'dashboard.no_displays': 'Noch keine Bildschirme',
'dashboard.no_displays_desc': 'Installieren Sie die ScreenTinker-App auf Ihrem TV und koppeln Sie ihn mit dem obigen Button.',
'dashboard.no_displays_desc': 'Installieren Sie die SwiftDisplay-App auf Ihrem TV und koppeln Sie ihn mit dem obigen Button.',
'dashboard.failed_to_load': 'Bildschirme konnten nicht geladen werden',
'dashboard.unknown_playlist': 'Unbekannte Playlist',
'dashboard.mixed_playlists': 'Gemischte Playlists',
@ -428,7 +428,7 @@ export default {
'settings.custom_domain': 'Benutzerdefinierte Domain',
'settings.favicon_url': 'Favicon-URL',
'settings.custom_css': 'Benutzerdefiniertes CSS (optional)',
'settings.hide_branding': '„ScreenTinker"-Branding ausblenden',
'settings.hide_branding': '„SwiftDisplay"-Branding ausblenden',
'settings.save_branding': 'Branding speichern',
'settings.preview': 'Vorschau',
'settings.white_label_enterprise_only': 'Benutzerdefiniertes Branding ist im Enterprise-Plan verfügbar',
@ -438,7 +438,7 @@ export default {
'settings.api_endpoint': 'API-Endpunkt',
'settings.server_url_hint': 'Verwenden Sie diese URL beim Einrichten der Android-App',
'settings.setup_guide': 'Setup-Anleitung',
'settings.setup_step_1': 'Installieren Sie die ScreenTinker APK auf Ihrem TV via Sideloading',
'settings.setup_step_1': 'Installieren Sie die SwiftDisplay APK auf Ihrem TV via Sideloading',
'settings.setup_step_2_prefix': 'Öffnen Sie die App und geben Sie diese Server-URL ein:',
'settings.setup_step_3': 'Die App zeigt einen 6-stelligen Kopplungscode an',
'settings.setup_step_4': 'Klicken Sie auf „Bildschirm hinzufügen" und geben Sie den Code ein',
@ -456,7 +456,7 @@ export default {
'settings.import.reading_file': 'Datei wird gelesen...',
'settings.import.zip_detected': 'ZIP-Export erkannt: <strong>{name}</strong> ({size} MB)<br>Enthält Daten + Mediendateien.',
'settings.import.confirm': 'Import bestätigen',
'settings.import.invalid_file': 'Ungültige Datei. Muss ein ScreenTinker-Export-JSON oder ZIP sein.',
'settings.import.invalid_file': 'Ungültige Datei. Muss ein SwiftDisplay-Export-JSON oder ZIP sein.',
'settings.import.summary_devices': '{n} Geräte',
'settings.import.summary_content': '{n} Inhalte',
'settings.import.summary_widgets': '{n} Widgets',
@ -806,7 +806,7 @@ export default {
'onboarding.skip': 'Assistent überspringen',
'onboarding.go_to_dashboard': 'Zum Dashboard',
'onboarding.pair_display': 'Bildschirm koppeln',
'onboarding.step.welcome.title': 'Willkommen bei ScreenTinker!',
'onboarding.step.welcome.title': 'Willkommen bei SwiftDisplay!',
'onboarding.step.welcome.intro': 'Lassen Sie uns alles in unter 5 Minuten einrichten.',
'onboarding.step.welcome.guide_through': 'Dieser Assistent führt Sie durch:',
'onboarding.step.welcome.bullet_download': 'Player-App herunterladen',

View file

@ -95,7 +95,7 @@ export default {
'dashboard.total_displays': 'Total Displays',
'dashboard.ungrouped': 'Ungrouped',
'dashboard.no_displays': 'No displays yet',
'dashboard.no_displays_desc': 'Install the ScreenTinker app on your TV and pair it using the button above.',
'dashboard.no_displays_desc': 'Install the SwiftDisplay app on your TV and pair it using the button above.',
'dashboard.failed_to_load': 'Failed to load displays',
'dashboard.unknown_playlist': 'Unknown playlist',
'dashboard.mixed_playlists': 'Mixed playlists',
@ -245,7 +245,7 @@ export default {
'device.owner_provision.adb_label': 'Or over ADB (fresh device, no accounts, USB debugging on):',
'device.owner_provision.copy': 'Copy',
'device.owner_provision.copied': 'Command copied',
'device.owner_provision.constraints': 'Requires a freshly set-up / factory-reset device with no accounts, done before other device-owner apps enroll. If an MDM already owns the device, ScreenTinker stays at Tier 0/1 and the MDM owns updates.',
'device.owner_provision.constraints': 'Requires a freshly set-up / factory-reset device with no accounts, done before other device-owner apps enroll. If an MDM already owns the device, SwiftDisplay stays at Tier 0/1 and the MDM owns updates.',
'device.owner_provision.error': 'Failed to load provisioning info',
'device.owner_provision.verified_from_apk': 'Signature verified from the current server APK — always matches the build it installs.',
'device.owner_provision.fallback_checksum': 'No APK on the server yet — using the fallback checksum. Upload the player APK before provisioning.',
@ -287,7 +287,7 @@ export default {
'device.tab.controls_tip': 'Volume, brightness and sleep timeout — no device owner needed. System brightness + sleep need the panel to grant "System settings" (or be a device owner).',
'device.tab.terminal': 'Terminal',
'device.tab.terminal_tip': 'Device-owner shell (runs as the app UID) + push an APK. Preset commands for quick diagnostics.',
'device.terminal.welcome': 'ScreenTinker shell — runs as the app UID (not root). Type a command or tap a preset.',
'device.terminal.welcome': 'SwiftDisplay shell — runs as the app UID (not root). Type a command or tap a preset.',
'device.terminal.placeholder': 'command, e.g. getprop ro.product.model',
'device.terminal.run': 'Run',
'device.terminal.clear': 'Clear',
@ -593,7 +593,7 @@ export default {
'settings.custom_domain': 'Custom Domain',
'settings.favicon_url': 'Favicon URL',
'settings.custom_css': 'Custom CSS (optional)',
'settings.hide_branding': 'Hide "ScreenTinker" branding',
'settings.hide_branding': 'Hide "SwiftDisplay" branding',
'settings.save_branding': 'Save Branding',
'settings.preview': 'Preview',
'settings.white_label_enterprise_only': 'Custom branding is available on the Enterprise plan',
@ -603,7 +603,7 @@ export default {
'settings.api_endpoint': 'API Endpoint',
'settings.server_url_hint': 'Use this URL when setting up the Android app',
'settings.setup_guide': 'Setup Guide',
'settings.setup_step_1': 'Install the ScreenTinker APK on your TV via sideloading',
'settings.setup_step_1': 'Install the SwiftDisplay APK on your TV via sideloading',
'settings.setup_step_2_prefix': 'Open the app and enter this server URL:',
'settings.setup_step_3': 'The app will display a 6-digit pairing code',
'settings.setup_step_4': 'Click "Add Display" on the dashboard and enter the pairing code',
@ -622,7 +622,7 @@ export default {
'settings.import.reading_file': 'Reading file...',
'settings.import.zip_detected': 'ZIP export detected: <strong>{name}</strong> ({size} MB)<br>Contains data + media files.',
'settings.import.confirm': 'Confirm Import',
'settings.import.invalid_file': 'Invalid file. Must be a ScreenTinker export JSON or ZIP.',
'settings.import.invalid_file': 'Invalid file. Must be a SwiftDisplay export JSON or ZIP.',
'settings.import.summary_devices': '{n} devices',
'settings.import.summary_content': '{n} content items',
'settings.import.summary_widgets': '{n} widgets',
@ -828,7 +828,7 @@ export default {
// Designer
'designer.title': 'Content Designer',
'designer.subtitle': 'Create dynamic signage content',
'designer.ai.title': ' AI generate',
'designer.ai.title': '<i class="fa-solid fa-wand-magic-sparkles"></i> AI generate',
'designer.ai.settings': 'AI settings',
'designer.ai.placeholder': "Describe your sign — e.g. 'Summer sale, 20% off mains, bright modern'",
'designer.ai.generate': 'Generate design',
@ -1046,7 +1046,7 @@ export default {
'onboarding.skip': 'Skip Wizard',
'onboarding.go_to_dashboard': 'Go to Dashboard',
'onboarding.pair_display': 'Pair Display',
'onboarding.step.welcome.title': 'Welcome to ScreenTinker!',
'onboarding.step.welcome.title': 'Welcome to SwiftDisplay!',
'onboarding.step.welcome.intro': "Let's get you set up in under 5 minutes.",
'onboarding.step.welcome.guide_through': 'This wizard will guide you through:',
'onboarding.step.welcome.bullet_download': 'Downloading the player app',

View file

@ -89,7 +89,7 @@ export default {
'dashboard.total_displays': 'Pantallas totales',
'dashboard.ungrouped': 'Sin grupo',
'dashboard.no_displays': 'Aún no hay pantallas',
'dashboard.no_displays_desc': 'Instala la aplicación de ScreenTinker en tu TV y vincúlala con el botón de arriba.',
'dashboard.no_displays_desc': 'Instala la aplicación de SwiftDisplay en tu TV y vincúlala con el botón de arriba.',
'dashboard.failed_to_load': 'Error al cargar las pantallas',
'dashboard.unknown_playlist': 'Lista desconocida',
'dashboard.mixed_playlists': 'Listas variadas',
@ -428,7 +428,7 @@ export default {
'settings.custom_domain': 'Dominio personalizado',
'settings.favicon_url': 'URL del favicon',
'settings.custom_css': 'CSS personalizado (opcional)',
'settings.hide_branding': 'Ocultar la marca "ScreenTinker"',
'settings.hide_branding': 'Ocultar la marca "SwiftDisplay"',
'settings.save_branding': 'Guardar branding',
'settings.preview': 'Previsualizar',
'settings.white_label_enterprise_only': 'El branding personalizado está disponible en el plan Enterprise',
@ -438,7 +438,7 @@ export default {
'settings.api_endpoint': 'Endpoint de la API',
'settings.server_url_hint': 'Usa esta URL al configurar la app de Android',
'settings.setup_guide': 'Guía de instalación',
'settings.setup_step_1': 'Instala el APK de ScreenTinker en tu TV mediante sideloading',
'settings.setup_step_1': 'Instala el APK de SwiftDisplay en tu TV mediante sideloading',
'settings.setup_step_2_prefix': 'Abre la app e ingresa esta URL del servidor:',
'settings.setup_step_3': 'La app mostrará un código de vinculación de 6 dígitos',
'settings.setup_step_4': 'Haz clic en "Agregar pantalla" en el panel e ingresa el código',
@ -456,7 +456,7 @@ export default {
'settings.import.reading_file': 'Leyendo archivo...',
'settings.import.zip_detected': 'Exportación ZIP detectada: <strong>{name}</strong> ({size} MB)<br>Contiene datos + archivos multimedia.',
'settings.import.confirm': 'Confirmar importación',
'settings.import.invalid_file': 'Archivo no válido. Debe ser un JSON o ZIP de exportación de ScreenTinker.',
'settings.import.invalid_file': 'Archivo no válido. Debe ser un JSON o ZIP de exportación de SwiftDisplay.',
'settings.import.summary_devices': '{n} dispositivos',
'settings.import.summary_content': '{n} elementos de contenido',
'settings.import.summary_widgets': '{n} widgets',
@ -806,7 +806,7 @@ export default {
'onboarding.skip': 'Omitir asistente',
'onboarding.go_to_dashboard': 'Ir al panel',
'onboarding.pair_display': 'Vincular pantalla',
'onboarding.step.welcome.title': '¡Bienvenido a ScreenTinker!',
'onboarding.step.welcome.title': '¡Bienvenido a SwiftDisplay!',
'onboarding.step.welcome.intro': 'Vamos a configurarlo todo en menos de 5 minutos.',
'onboarding.step.welcome.guide_through': 'Este asistente te guiará a través de:',
'onboarding.step.welcome.bullet_download': 'Descargar la app del reproductor',

View file

@ -89,7 +89,7 @@ export default {
'dashboard.total_displays': 'Écrans totaux',
'dashboard.ungrouped': 'Sans groupe',
'dashboard.no_displays': 'Aucun écran pour le moment',
'dashboard.no_displays_desc': 'Installez l\'application ScreenTinker sur votre TV et appariez-la avec le bouton ci-dessus.',
'dashboard.no_displays_desc': 'Installez l\'application SwiftDisplay sur votre TV et appariez-la avec le bouton ci-dessus.',
'dashboard.failed_to_load': 'Échec du chargement des écrans',
'dashboard.unknown_playlist': 'Liste de lecture inconnue',
'dashboard.mixed_playlists': 'Listes mixtes',
@ -428,7 +428,7 @@ export default {
'settings.custom_domain': 'Domaine personnalisé',
'settings.favicon_url': 'URL du favicon',
'settings.custom_css': 'CSS personnalisé (facultatif)',
'settings.hide_branding': 'Masquer la marque « ScreenTinker »',
'settings.hide_branding': 'Masquer la marque « SwiftDisplay »',
'settings.save_branding': 'Enregistrer le branding',
'settings.preview': 'Aperçu',
'settings.white_label_enterprise_only': 'Le branding personnalisé est disponible sur le plan Enterprise',
@ -438,7 +438,7 @@ export default {
'settings.api_endpoint': 'Point de terminaison API',
'settings.server_url_hint': 'Utilisez cette URL pour configurer l\'app Android',
'settings.setup_guide': 'Guide d\'installation',
'settings.setup_step_1': 'Installez l\'APK ScreenTinker sur votre TV via le sideloading',
'settings.setup_step_1': 'Installez l\'APK SwiftDisplay sur votre TV via le sideloading',
'settings.setup_step_2_prefix': 'Ouvrez l\'app et saisissez cette URL du serveur :',
'settings.setup_step_3': 'L\'app affichera un code d\'appairage à 6 chiffres',
'settings.setup_step_4': 'Cliquez sur « Ajouter un écran » et saisissez le code',
@ -456,7 +456,7 @@ export default {
'settings.import.reading_file': 'Lecture du fichier...',
'settings.import.zip_detected': 'Export ZIP détecté : <strong>{name}</strong> ({size} Mo)<br>Contient données + fichiers médias.',
'settings.import.confirm': 'Confirmer l\'import',
'settings.import.invalid_file': 'Fichier invalide. Doit être un JSON ou ZIP d\'export ScreenTinker.',
'settings.import.invalid_file': 'Fichier invalide. Doit être un JSON ou ZIP d\'export SwiftDisplay.',
'settings.import.summary_devices': '{n} appareils',
'settings.import.summary_content': '{n} contenus',
'settings.import.summary_widgets': '{n} widgets',
@ -806,7 +806,7 @@ export default {
'onboarding.skip': 'Ignorer l\'assistant',
'onboarding.go_to_dashboard': 'Aller au tableau de bord',
'onboarding.pair_display': 'Apparier l\'écran',
'onboarding.step.welcome.title': 'Bienvenue sur ScreenTinker !',
'onboarding.step.welcome.title': 'Bienvenue sur SwiftDisplay !',
'onboarding.step.welcome.intro': 'Configurons tout en moins de 5 minutes.',
'onboarding.step.welcome.guide_through': 'Cet assistant vous guidera à travers :',
'onboarding.step.welcome.bullet_download': 'Télécharger l\'app du lecteur',

View file

@ -88,7 +88,7 @@ export default {
'dashboard.total_displays': 'Schermi Totali',
'dashboard.ungrouped': 'Non raggruppati',
'dashboard.no_displays': 'Nessun schermo presente',
'dashboard.no_displays_desc': 'Installa l\'app ScreenTinker sulla tua TV e associala usando il pulsante sopra.',
'dashboard.no_displays_desc': 'Installa l\'app SwiftDisplay sulla tua TV e associala usando il pulsante sopra.',
'dashboard.failed_to_load': 'Caricamento schermi fallito',
'dashboard.unknown_playlist': 'Playlist sconosciuta',
'dashboard.mixed_playlists': 'Playlist miste',
@ -404,7 +404,7 @@ export default {
'settings.custom_domain': 'Dominio Personalizzato',
'settings.favicon_url': 'URL Favicon',
'settings.custom_css': 'CSS Personalizzato (opzionale)',
'settings.hide_branding': 'Nascondi marchio "ScreenTinker"',
'settings.hide_branding': 'Nascondi marchio "SwiftDisplay"',
'settings.save_branding': 'Salva Marchio',
'settings.preview': 'Anteprima',
'settings.white_label_enterprise_only': 'Il marchio personalizzato è disponibile solo nel piano Enterprise',
@ -414,7 +414,7 @@ export default {
'settings.api_endpoint': 'Endpoint API',
'settings.server_url_hint': 'Usa questo URL durante la configurazione dell\'app Android',
'settings.setup_guide': 'Guida all\'installazione',
'settings.setup_step_1': 'Installa l\'APK di ScreenTinker sulla tua TV tramite sideloading',
'settings.setup_step_1': 'Installa l\'APK di SwiftDisplay sulla tua TV tramite sideloading',
'settings.setup_step_2_prefix': 'Apri l\'app e inserisci questo URL del server:',
'settings.setup_step_3': 'L\'app mostrerà un codice di associazione di 6 cifre',
'settings.setup_step_4': 'Clicca su "Aggiungi Schermo" nella dashboard e inserisci il codice',
@ -433,7 +433,7 @@ export default {
'settings.import.reading_file': 'Lettura del file...',
'settings.import.zip_detected': 'Rilevata esportazione ZIP: <strong>{name}</strong> ({size} MB)<br>Contiene dati + file multimediali.',
'settings.import.confirm': 'Conferma Importazione',
'settings.import.invalid_file': 'File non valido. Deve essere un file JSON o ZIP esportato da ScreenTinker.',
'settings.import.invalid_file': 'File non valido. Deve essere un file JSON o ZIP esportato da SwiftDisplay.',
'settings.import.summary_devices': '{n} dispositivi',
'settings.import.summary_content': '{n} contenuti',
'settings.import.summary_widgets': '{n} widget',
@ -764,7 +764,7 @@ export default {
'onboarding.skip': 'Salta Configurazione',
'onboarding.go_to_dashboard': 'Vai alla Dashboard',
'onboarding.pair_display': 'Associa Schermo',
'onboarding.step.welcome.title': 'Benvenuto su ScreenTinker!',
'onboarding.step.welcome.title': 'Benvenuto su SwiftDisplay!',
'onboarding.step.welcome.intro': "Configuriamo il tutto in meno di 5 minuti.",
'onboarding.step.welcome.guide_through': 'Questa procedura guidata ti aiuterà a:',
'onboarding.step.welcome.bullet_download': 'Scaricare l\'app del player',

View file

@ -89,7 +89,7 @@ export default {
'dashboard.total_displays': 'Total de telas',
'dashboard.ungrouped': 'Sem grupo',
'dashboard.no_displays': 'Nenhuma tela ainda',
'dashboard.no_displays_desc': 'Instale o aplicativo ScreenTinker na sua TV e pareie com o botão acima.',
'dashboard.no_displays_desc': 'Instale o aplicativo SwiftDisplay na sua TV e pareie com o botão acima.',
'dashboard.failed_to_load': 'Falha ao carregar as telas',
'dashboard.unknown_playlist': 'Playlist desconhecida',
'dashboard.mixed_playlists': 'Playlists variadas',
@ -428,7 +428,7 @@ export default {
'settings.custom_domain': 'Domínio personalizado',
'settings.favicon_url': 'URL do favicon',
'settings.custom_css': 'CSS personalizado (opcional)',
'settings.hide_branding': 'Ocultar marca "ScreenTinker"',
'settings.hide_branding': 'Ocultar marca "SwiftDisplay"',
'settings.save_branding': 'Salvar branding',
'settings.preview': 'Pré-visualizar',
'settings.white_label_enterprise_only': 'Branding personalizado disponível no plano Enterprise',
@ -438,7 +438,7 @@ export default {
'settings.api_endpoint': 'Endpoint da API',
'settings.server_url_hint': 'Use esta URL ao configurar o app Android',
'settings.setup_guide': 'Guia de instalação',
'settings.setup_step_1': 'Instale o APK do ScreenTinker na sua TV via sideloading',
'settings.setup_step_1': 'Instale o APK do SwiftDisplay na sua TV via sideloading',
'settings.setup_step_2_prefix': 'Abra o app e digite esta URL do servidor:',
'settings.setup_step_3': 'O app exibirá um código de pareamento de 6 dígitos',
'settings.setup_step_4': 'Clique em "Adicionar tela" no painel e digite o código',
@ -456,7 +456,7 @@ export default {
'settings.import.reading_file': 'Lendo arquivo...',
'settings.import.zip_detected': 'Exportação ZIP detectada: <strong>{name}</strong> ({size} MB)<br>Contém dados + arquivos de mídia.',
'settings.import.confirm': 'Confirmar importação',
'settings.import.invalid_file': 'Arquivo inválido. Deve ser JSON ou ZIP de exportação do ScreenTinker.',
'settings.import.invalid_file': 'Arquivo inválido. Deve ser JSON ou ZIP de exportação do SwiftDisplay.',
'settings.import.summary_devices': '{n} dispositivos',
'settings.import.summary_content': '{n} itens de conteúdo',
'settings.import.summary_widgets': '{n} widgets',
@ -806,7 +806,7 @@ export default {
'onboarding.skip': 'Pular assistente',
'onboarding.go_to_dashboard': 'Ir para o painel',
'onboarding.pair_display': 'Parear tela',
'onboarding.step.welcome.title': 'Bem-vindo ao ScreenTinker!',
'onboarding.step.welcome.title': 'Bem-vindo ao SwiftDisplay!',
'onboarding.step.welcome.intro': 'Vamos configurar tudo em menos de 5 minutos.',
'onboarding.step.welcome.guide_through': 'Este assistente irá guiá-lo através de:',
'onboarding.step.welcome.bullet_download': 'Baixar o app do player',

View file

@ -211,7 +211,7 @@ async function loadBranding() {
const v = (x) => esc(x == null ? '' : x);
el.innerHTML = `
<div style="display:grid;grid-template-columns:1fr 1fr;gap:12px;max-width:640px">
<div class="form-group" style="grid-column:1/-1"><label>${t('admin.branding.brand_name')}</label><input type="text" id="brBrandName" class="input" placeholder="ScreenTinker" value="${v(b.brand_name)}"></div>
<div class="form-group" style="grid-column:1/-1"><label>${t('admin.branding.brand_name')}</label><input type="text" id="brBrandName" class="input" placeholder="SwiftDisplay" value="${v(b.brand_name)}"></div>
<div class="form-group"><label>${t('admin.branding.primary_color')}</label><input type="text" id="brPrimary" class="input" placeholder="#e65c00" value="${v(b.primary_color)}"></div>
<div class="form-group"><label>${t('admin.branding.bg_color')}</label><input type="text" id="brBg" class="input" placeholder="#111827" value="${v(b.bg_color)}"></div>
<div class="form-group" style="grid-column:1/-1"><label>${t('admin.branding.logo_url')}</label><input type="text" id="brLogo" class="input" placeholder="https:///logo.png" value="${v(b.logo_url)}"></div>
@ -226,7 +226,7 @@ async function loadBranding() {
document.getElementById('brSave').onclick = async () => {
try {
await api.adminSetBranding({
brand_name: document.getElementById('brBrandName').value.trim() || 'ScreenTinker',
brand_name: document.getElementById('brBrandName').value.trim() || 'SwiftDisplay',
primary_color: document.getElementById('brPrimary').value.trim() || null,
bg_color: document.getElementById('brBg').value.trim() || null,
logo_url: document.getElementById('brLogo').value.trim() || null,

View file

@ -38,7 +38,7 @@ export function render(container) {
{ q: 'How does the free trial work?', a: 'New accounts get a 14-day free trial of the Pro plan (15 devices, all features). After 14 days, you\'re moved to the Free plan (1 device) unless you upgrade.' },
{ q: 'Can I use portrait mode displays?', a: 'Yes! Set the orientation to "Portrait" in the device\'s Info tab. The content will be rotated accordingly.' },
{ q: 'What happens when a device goes offline?', a: 'Devices cache content locally, so they continue playing their playlist even without internet. You\'ll receive an email alert after 5 minutes of being offline.' },
{ q: 'Can I self-host ScreenTinker?', a: 'Yes! Deploy the server on your own infrastructure. All data stays on your network. Set SELF_HOSTED=true in the environment.' },
{ q: 'Can I self-host SwiftDisplay?', a: 'Yes! Deploy the server on your own infrastructure. All data stays on your network. Set SELF_HOSTED=true in the environment.' },
{ q: 'How do I update the Android app?', a: 'The app checks for updates automatically every 30 minutes. You can also force an update from the device\'s Info tab in the dashboard.' },
{ q: 'What video formats are supported?', a: 'MP4 (H.264), WebM, AVI, MKV, MOV. For best compatibility, use MP4 with H.264 encoding.' },
{ q: 'Can I white-label the dashboard?', a: 'Yes! Go to Settings > White Label to customize the brand name, colors, logo, and domain.' },

View file

@ -11,7 +11,7 @@ async function loadAuthConfig() {
}
// #15: resolve instance/default branding for the (pre-login) login page.
// Public endpoint: custom-domain match -> platform default -> ScreenTinker.
// Public endpoint: custom-domain match -> platform default -> SwiftDisplay.
async function loadLoginBranding() {
try {
const res = await fetch('/api/branding?domain=' + encodeURIComponent(location.hostname));
@ -47,8 +47,8 @@ export async function render(container) {
const canRegister = config.registration_enabled !== false;
applyLoginBrandingDoc(branding);
const brandName = branding.brand_name || 'ScreenTinker';
// Branded logo if set, else the default ScreenTinker glyph.
const brandName = branding.brand_name || 'SwiftDisplay';
// Branded logo if set, else the default SwiftDisplay glyph.
const logoHtml = branding.logo_url
? `<img src="${brandEsc(branding.logo_url)}" alt="${brandEsc(brandName)}" style="max-height:48px;max-width:200px;margin:0 auto 12px;display:block">`
: `<svg width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="var(--accent)" stroke-width="2" style="margin:0 auto 12px">

View file

@ -115,7 +115,7 @@ export async function render(container) {
<div id="whiteLabelForm">
<p style="color:var(--text-muted);font-size:12px;margin-bottom:16px">${t('settings.white_label_desc')}</p>
<div style="display:grid;grid-template-columns:1fr 1fr;gap:12px">
<div class="form-group"><label>${t('settings.brand_name')}</label><input type="text" id="wlBrandName" class="input" placeholder="ScreenTinker"></div>
<div class="form-group"><label>${t('settings.brand_name')}</label><input type="text" id="wlBrandName" class="input" placeholder="SwiftDisplay"></div>
<div class="form-group"><label>${t('settings.logo_url')}</label><input type="text" id="wlLogoUrl" class="input" placeholder="https://..."></div>
<div class="form-group"><label>${t('settings.primary_color')}</label><input type="color" id="wlPrimaryColor" value="#e65c00" style="width:100%;height:36px;border:none;cursor:pointer;border-radius:var(--radius)"></div>
<div class="form-group"><label>${t('settings.bg_color')}</label><input type="color" id="wlBgColor" value="#111827" style="width:100%;height:36px;border:none;cursor:pointer;border-radius:var(--radius)"></div>
@ -193,7 +193,7 @@ export async function render(container) {
<div class="settings-section">
<h3>${t('settings.about')}</h3>
<div style="color:var(--text-secondary);font-size:13px">
<p><strong>ScreenTinker</strong>${appVersion ? ` v${esc(appVersion)}` : ''}</p>
<p><strong>SwiftDisplay</strong>${appVersion ? ` v${esc(appVersion)}` : ''}</p>
<p style="margin-top:4px">${t('settings.about_tagline')}</p>
<p style="margin-top:12px">
<a href="/legal/terms.html" target="_blank" style="color:var(--accent);font-size:12px">${t('auth.terms')}</a>
@ -257,12 +257,12 @@ export async function render(container) {
let data;
if (isZip) {
// For ZIP, show basic info and skip preview parsing
data = { format: 'screentinker-export-v1', _isZip: true };
data = { format: 'swiftdisplay-export-v1', _isZip: true };
statusEl.innerHTML = `${t('settings.import.zip_detected', { name: esc(file.name), size: (file.size / 1048576).toFixed(1) })}<br><br><button class="btn btn-primary btn-sm" id="confirmImportBtn">${t('settings.import.confirm')}</button> <button class="btn btn-secondary btn-sm" id="cancelImportBtn">${t('common.cancel')}</button>`;
} else {
const text = await file.text();
data = JSON.parse(text);
if (!data.format || !data.format.startsWith('screentinker-export')) {
if (!data.format || !data.format.startsWith('swiftdisplay-export')) {
statusEl.style.color = 'var(--danger)';
statusEl.textContent = t('settings.import.invalid_file');
return;

View file

@ -4,7 +4,7 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Privacy Policy - ScreenTinker</title>
<title>Privacy Policy - SwiftDisplay</title>
<style>
* {
margin: 0;
@ -102,12 +102,12 @@
<body>
<div class="container">
<a href="/" class="back">&larr; Back to ScreenTinker</a>
<a href="/" class="back">&larr; Back to SwiftDisplay</a>
<h1>Privacy Policy</h1>
<p class="updated">Last updated: May 15, 2026</p>
<h2>1. Overview</h2>
<p>ScreenTinker ("we", "us", "our") respects your privacy. This policy explains what data we collect, how we use it,
<p>SwiftDisplay ("we", "us", "our") respects your privacy. This policy explains what data we collect, how we use it,
and your rights regarding your information.</p>
<h2>2. Information We Collect</h2>
@ -240,7 +240,7 @@
</tr>
</table>
<p>This telemetry can be disabled by self-hosters via the <code>PLAYER_DEBUG_REPORTING=off</code> environment
variable. On screentinker.com it is on by default.</p>
variable. On swiftdisplay.com it is on by default.</p>
<h2>3. How We Use Your Information</h2>
<ul>
@ -263,7 +263,7 @@
</ul>
<h2>5. Self-Hosted Deployments</h2>
<p>If you self-host ScreenTinker on your own infrastructure:</p>
<p>If you self-host SwiftDisplay on your own infrastructure:</p>
<ul>
<li>All data stays on your servers. We have no access to it.</li>
<li>You are the data controller and responsible for compliance with applicable privacy laws.</li>
@ -326,7 +326,7 @@
<h2>13. Contact Us</h2>
<p>For privacy-related questions or data requests, contact us at:</p>
<p>Email: support@screentinker.com</p>
<p>Email: support@swiftdisplay.com</p>
</div>
</body>

View file

@ -4,7 +4,7 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Terms of Service - ScreenTinker</title>
<title>Terms of Service - SwiftDisplay</title>
<style>
* {
margin: 0;
@ -76,16 +76,16 @@
<body>
<div class="container">
<a href="/" class="back">&larr; Back to ScreenTinker</a>
<a href="/" class="back">&larr; Back to SwiftDisplay</a>
<h1>Terms of Service</h1>
<p class="updated">Last updated: April 24, 2026</p>
<h2>1. Acceptance of Terms</h2>
<p>By accessing or using ScreenTinker ("the Service"), you agree to be bound by these Terms of Service. If you do
<p>By accessing or using SwiftDisplay ("the Service"), you agree to be bound by these Terms of Service. If you do
not agree, do not use the Service.</p>
<h2>2. Description of Service</h2>
<p>ScreenTinker is a digital signage management platform that allows users to remotely manage content on display
<p>SwiftDisplay is a digital signage management platform that allows users to remotely manage content on display
devices. The Service includes a web dashboard, API, Android application, web player, and related tools.</p>
<h2>3. Accounts</h2>
@ -115,7 +115,7 @@
</ul>
<h2>5.1 Prohibited Content - Zero Tolerance</h2>
<p>ScreenTinker maintains zero tolerance for child sexual abuse material (CSAM). Any account found to upload,
<p>SwiftDisplay maintains zero tolerance for child sexual abuse material (CSAM). Any account found to upload,
display, transmit, or facilitate the distribution of such material will be immediately terminated and reported to
the National Center for Missing and Exploited Children (NCMEC) and appropriate law enforcement agencies, as
required under 18 U.S.C. 2258A.</p>
@ -141,7 +141,7 @@
</ul>
<h2>8. Self-Hosted Deployments</h2>
<p>If you deploy ScreenTinker on your own infrastructure:</p>
<p>If you deploy SwiftDisplay on your own infrastructure:</p>
<ul>
<li>You are responsible for server security, backups, and maintenance.</li>
<li>We provide the software as-is without managed hosting guarantees.</li>
@ -159,16 +159,16 @@
</ul>
<h2>11. Intellectual Property</h2>
<p>The ScreenTinker software, dashboard, APIs, and documentation are our intellectual property. Your subscription
<p>The SwiftDisplay software, dashboard, APIs, and documentation are our intellectual property. Your subscription
grants you a license to use the Service, not ownership of the software.</p>
<p>ScreenTinker incorporates open-source software components licensed under MIT and Apache 2.0 licenses. A complete
<p>SwiftDisplay incorporates open-source software components licensed under MIT and Apache 2.0 licenses. A complete
list of third-party software and their licenses is available at our <a href="/legal/third-party.html">Third-Party
Software Notices</a> page.</p>
<h2>12. Restrictions</h2>
<p>The core ScreenTinker software is open-source and available at <a
href="https://github.com/screentinker/screentinker">github.com/screentinker/screentinker</a> under the MIT
License. The restrictions in this section apply only to the hosted Service at screentinker.com and to proprietary
<p>The core SwiftDisplay software is open-source and available at <a
href="https://github.com/swiftdisplay/swiftdisplay">github.com/swiftdisplay/swiftdisplay</a> under the MIT
License. The restrictions in this section apply only to the hosted Service at swiftdisplay.com and to proprietary
components that are not published under the MIT License, including the license key generation and validation
system, billing infrastructure, and internal deployment tooling.</p>
<p>In connection with your use of the hosted Service and those proprietary components, you agree not to, and will
@ -186,11 +186,11 @@
</ul>
<p>Violation of these restrictions may result in immediate termination of your account and may subject you to legal
action. Nothing in this section limits, modifies, or overrides any rights granted to you by the MIT License
covering the open-source portion of ScreenTinker, which governs that code exclusively.</p>
covering the open-source portion of SwiftDisplay, which governs that code exclusively.</p>
<h2>13. License Keys and Self-Hosted Deployments</h2>
<ul>
<li>Self-hosted Enterprise deployments require a valid license key issued by ScreenTinker.</li>
<li>Self-hosted Enterprise deployments require a valid license key issued by SwiftDisplay.</li>
<li>License keys are non-transferable and tied to a specific organization.</li>
<li>License keys are issued for a specific term (monthly or annual) and must be renewed to maintain functionality.
</li>
@ -231,7 +231,7 @@
force and effect.</p>
<h2>18. Contact</h2>
<p>For questions about these terms, contact us at support@screentinker.com</p>
<p>For questions about these terms, contact us at support@swiftdisplay.com</p>
</div>
</body>

View file

@ -4,7 +4,7 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Third-Party Licenses - ScreenTinker</title>
<title>Third-Party Licenses - SwiftDisplay</title>
<style>
* {
margin: 0;
@ -105,11 +105,11 @@
<body>
<div class="container">
<a href="/" class="back">&larr; Back to ScreenTinker</a>
<a href="/" class="back">&larr; Back to SwiftDisplay</a>
<h1>Third-Party Software Notices</h1>
<p class="updated">Last updated: March 24, 2026</p>
<p>ScreenTinker uses the following open-source software components. We gratefully acknowledge the contributions of
<p>SwiftDisplay uses the following open-source software components. We gratefully acknowledge the contributions of
these projects and their maintainers.</p>
<h2>Summary</h2>
@ -271,8 +271,8 @@
limitations under the License.</div>
<h2>Contact</h2>
<p>If you have questions about the licensing of any component used in ScreenTinker, please contact us at
support@screentinker.com</p>
<p>If you have questions about the licensing of any component used in SwiftDisplay, please contact us at
support@swiftdisplay.com</p>
</div>
</body>

View file

@ -6,6 +6,7 @@
"license": "MIT",
"scripts": {
"build": "npm install --prefix server",
"postinstall": "node scripts/fix-htaccess.js",
"build:manifest": "node shared/Transitions/generate-manifest.js",
"test:shaders": "node shared/Transitions/compile-test.js"
},

37
scripts/fix-htaccess.js Normal file
View file

@ -0,0 +1,37 @@
const fs = require('fs');
const path = require('path');
// Hostinger often creates .htaccess either in the current app dir or public_html
const possiblePaths = [
path.resolve(__dirname, '../.htaccess'),
path.resolve(__dirname, '../../.htaccess'),
path.resolve(__dirname, '../../public_html/.htaccess')
];
let fixed = false;
for (const htaccessPath of possiblePaths) {
try {
if (fs.existsSync(htaccessPath)) {
let content = fs.readFileSync(htaccessPath, 'utf8');
// Hostinger auto-appends this line during git deployment, which crashes the app
if (content.includes('SetEnv NODE_OPTIONS')) {
console.log(`[fix-htaccess] Found bad Hostinger config in ${htaccessPath}`);
// Remove the offending line completely
content = content.replace(/^.*SetEnv NODE_OPTIONS.*$/gm, '');
fs.writeFileSync(htaccessPath, content.trim() + '\n', 'utf8');
console.log(`[fix-htaccess] Successfully removed SetEnv NODE_OPTIONS!`);
fixed = true;
}
}
} catch (err) {
console.error(`[fix-htaccess] Error checking ${htaccessPath}:`, err.message);
}
}
if (!fixed) {
console.log('[fix-htaccess] No .htaccess modifications needed.');
}

View file

View file

@ -430,7 +430,7 @@
pairing_hint: 'Enter this code in the dashboard to pair this display',
connecting: 'Connecting...',
connecting_muted: 'Connecting (audio muted)...',
info_title: 'ScreenTinker Web Player',
info_title: 'SwiftDisplay Web Player',
info_close_hint: 'Press Back again or click to close',
info_device_id: 'Device ID',
info_device_name: 'Device Name',
@ -452,16 +452,16 @@
preview_webpage_blocked: 'If this area is blank, the site blocks embedding in a browser — it will still display on the device screen.',
},
es: {
web_player: 'Reproductor web', server_url: 'URL del servidor', server_url_placeholder: 'https://signage.tudominio.com', connect: 'Conectar', pairing_code: 'Código de vinculación', pairing_hint: 'Ingresa este código en el panel para vincular esta pantalla', connecting: 'Conectando...', connecting_muted: 'Conectando (audio silenciado)...', info_title: 'Reproductor web ScreenTinker', info_close_hint: 'Presiona Atrás de nuevo o haz clic para cerrar', info_device_id: 'ID del dispositivo', info_device_name: 'Nombre del dispositivo', info_server: 'Servidor', info_status: 'Estado', info_now_playing: 'Reproduciendo', info_resolution: 'Resolución', info_uptime: 'Tiempo activo', info_platform: 'Plataforma', info_cache: 'Caché', info_connected: 'Conectado', info_disconnected: 'Desconectado', info_active: 'Activo', info_inactive: 'Inactivo', info_nothing: 'Nada', info_na: 'N/D', info_sw: 'Service Worker', nothing_scheduled: 'No hay nada programado en este momento', preview_webpage_blocked: 'Si esta área está en blanco, el sitio bloquea la inserción en un navegador; aún se mostrará en la pantalla del dispositivo.',
web_player: 'Reproductor web', server_url: 'URL del servidor', server_url_placeholder: 'https://signage.tudominio.com', connect: 'Conectar', pairing_code: 'Código de vinculación', pairing_hint: 'Ingresa este código en el panel para vincular esta pantalla', connecting: 'Conectando...', connecting_muted: 'Conectando (audio silenciado)...', info_title: 'Reproductor web SwiftDisplay', info_close_hint: 'Presiona Atrás de nuevo o haz clic para cerrar', info_device_id: 'ID del dispositivo', info_device_name: 'Nombre del dispositivo', info_server: 'Servidor', info_status: 'Estado', info_now_playing: 'Reproduciendo', info_resolution: 'Resolución', info_uptime: 'Tiempo activo', info_platform: 'Plataforma', info_cache: 'Caché', info_connected: 'Conectado', info_disconnected: 'Desconectado', info_active: 'Activo', info_inactive: 'Inactivo', info_nothing: 'Nada', info_na: 'N/D', info_sw: 'Service Worker', nothing_scheduled: 'No hay nada programado en este momento', preview_webpage_blocked: 'Si esta área está en blanco, el sitio bloquea la inserción en un navegador; aún se mostrará en la pantalla del dispositivo.',
},
fr: {
web_player: 'Lecteur web', server_url: 'URL du serveur', server_url_placeholder: 'https://signage.votredomaine.com', connect: 'Connecter', pairing_code: 'Code dappairage', pairing_hint: 'Saisissez ce code dans le tableau de bord pour apparier cet écran', connecting: 'Connexion...', connecting_muted: 'Connexion (audio coupé)...', info_title: 'Lecteur web ScreenTinker', info_close_hint: 'Appuyez à nouveau sur Retour ou cliquez pour fermer', info_device_id: 'ID de lappareil', info_device_name: 'Nom de lappareil', info_server: 'Serveur', info_status: 'État', info_now_playing: 'En lecture', info_resolution: 'Résolution', info_uptime: 'Disponibilité', info_platform: 'Plateforme', info_cache: 'Cache', info_connected: 'Connecté', info_disconnected: 'Déconnecté', info_active: 'Actif', info_inactive: 'Inactif', info_nothing: 'Rien', info_na: 'N/D', info_sw: 'Service Worker', nothing_scheduled: 'Rien de programmé pour le moment', preview_webpage_blocked: 'Si cette zone est vide, le site bloque lintégration dans un navigateur ; il saffichera quand même sur lécran de lappareil.',
web_player: 'Lecteur web', server_url: 'URL du serveur', server_url_placeholder: 'https://signage.votredomaine.com', connect: 'Connecter', pairing_code: 'Code dappairage', pairing_hint: 'Saisissez ce code dans le tableau de bord pour apparier cet écran', connecting: 'Connexion...', connecting_muted: 'Connexion (audio coupé)...', info_title: 'Lecteur web SwiftDisplay', info_close_hint: 'Appuyez à nouveau sur Retour ou cliquez pour fermer', info_device_id: 'ID de lappareil', info_device_name: 'Nom de lappareil', info_server: 'Serveur', info_status: 'État', info_now_playing: 'En lecture', info_resolution: 'Résolution', info_uptime: 'Disponibilité', info_platform: 'Plateforme', info_cache: 'Cache', info_connected: 'Connecté', info_disconnected: 'Déconnecté', info_active: 'Actif', info_inactive: 'Inactif', info_nothing: 'Rien', info_na: 'N/D', info_sw: 'Service Worker', nothing_scheduled: 'Rien de programmé pour le moment', preview_webpage_blocked: 'Si cette zone est vide, le site bloque lintégration dans un navigateur ; il saffichera quand même sur lécran de lappareil.',
},
de: {
web_player: 'Web-Player', server_url: 'Server-URL', server_url_placeholder: 'https://signage.ihredomain.com', connect: 'Verbinden', pairing_code: 'Kopplungscode', pairing_hint: 'Geben Sie diesen Code im Dashboard ein, um diesen Bildschirm zu koppeln', connecting: 'Verbindung wird hergestellt...', connecting_muted: 'Verbindung (Audio stummgeschaltet)...', info_title: 'ScreenTinker Web-Player', info_close_hint: 'Erneut Zurück drücken oder klicken zum Schließen', info_device_id: 'Geräte-ID', info_device_name: 'Gerätename', info_server: 'Server', info_status: 'Status', info_now_playing: 'Aktuelle Wiedergabe', info_resolution: 'Auflösung', info_uptime: 'Betriebszeit', info_platform: 'Plattform', info_cache: 'Cache', info_connected: 'Verbunden', info_disconnected: 'Getrennt', info_active: 'Aktiv', info_inactive: 'Inaktiv', info_nothing: 'Nichts', info_na: 'N/V', info_sw: 'Service Worker', nothing_scheduled: 'Derzeit ist nichts geplant', preview_webpage_blocked: 'Wenn dieser Bereich leer ist, blockiert die Website die Einbettung im Browser auf dem Gerätebildschirm wird sie trotzdem angezeigt.',
web_player: 'Web-Player', server_url: 'Server-URL', server_url_placeholder: 'https://signage.ihredomain.com', connect: 'Verbinden', pairing_code: 'Kopplungscode', pairing_hint: 'Geben Sie diesen Code im Dashboard ein, um diesen Bildschirm zu koppeln', connecting: 'Verbindung wird hergestellt...', connecting_muted: 'Verbindung (Audio stummgeschaltet)...', info_title: 'SwiftDisplay Web-Player', info_close_hint: 'Erneut Zurück drücken oder klicken zum Schließen', info_device_id: 'Geräte-ID', info_device_name: 'Gerätename', info_server: 'Server', info_status: 'Status', info_now_playing: 'Aktuelle Wiedergabe', info_resolution: 'Auflösung', info_uptime: 'Betriebszeit', info_platform: 'Plattform', info_cache: 'Cache', info_connected: 'Verbunden', info_disconnected: 'Getrennt', info_active: 'Aktiv', info_inactive: 'Inaktiv', info_nothing: 'Nichts', info_na: 'N/V', info_sw: 'Service Worker', nothing_scheduled: 'Derzeit ist nichts geplant', preview_webpage_blocked: 'Wenn dieser Bereich leer ist, blockiert die Website die Einbettung im Browser auf dem Gerätebildschirm wird sie trotzdem angezeigt.',
},
pt: {
web_player: 'Player web', server_url: 'URL do servidor', server_url_placeholder: 'https://sign.seudominio.com', connect: 'Conectar', pairing_code: 'Código de pareamento', pairing_hint: 'Digite este código no painel para parear esta tela', connecting: 'Conectando...', connecting_muted: 'Conectando (áudio mudo)...', info_title: 'Player web ScreenTinker', info_close_hint: 'Pressione Voltar novamente ou clique para fechar', info_device_id: 'ID do dispositivo', info_device_name: 'Nome do dispositivo', info_server: 'Servidor', info_status: 'Status', info_now_playing: 'Reproduzindo', info_resolution: 'Resolução', info_uptime: 'Tempo ativo', info_platform: 'Plataforma', info_cache: 'Cache', info_connected: 'Conectado', info_disconnected: 'Desconectado', info_active: 'Ativo', info_inactive: 'Inativo', info_nothing: 'Nada', info_na: 'N/D', info_sw: 'Service Worker', nothing_scheduled: 'Nada programado no momento', preview_webpage_blocked: 'Se esta área estiver em branco, o site bloqueia a incorporação em um navegador; ainda assim será exibido na tela do dispositivo.',
web_player: 'Player web', server_url: 'URL do servidor', server_url_placeholder: 'https://sign.seudominio.com', connect: 'Conectar', pairing_code: 'Código de pareamento', pairing_hint: 'Digite este código no painel para parear esta tela', connecting: 'Conectando...', connecting_muted: 'Conectando (áudio mudo)...', info_title: 'Player web SwiftDisplay', info_close_hint: 'Pressione Voltar novamente ou clique para fechar', info_device_id: 'ID do dispositivo', info_device_name: 'Nome do dispositivo', info_server: 'Servidor', info_status: 'Status', info_now_playing: 'Reproduzindo', info_resolution: 'Resolução', info_uptime: 'Tempo ativo', info_platform: 'Plataforma', info_cache: 'Cache', info_connected: 'Conectado', info_disconnected: 'Desconectado', info_active: 'Ativo', info_inactive: 'Inativo', info_nothing: 'Nada', info_na: 'N/D', info_sw: 'Service Worker', nothing_scheduled: 'Nada programado no momento', preview_webpage_blocked: 'Se esta área estiver em branco, o site bloqueia a incorporação em um navegador; ainda assim será exibido na tela do dispositivo.',
},
};
const PLAYER_LANG = (() => {
@ -3131,7 +3131,7 @@
ctx.fillStyle = '#e65c00';
ctx.font = 'bold 28px sans-serif';
ctx.textAlign = 'center';
ctx.fillText('ScreenTinker Web Player', W / 2, H / 2 - 40);
ctx.fillText('SwiftDisplay Web Player', W / 2, H / 2 - 40);
ctx.fillStyle = '#94a3b8';
ctx.font = '16px sans-serif';
const item = playlist[currentIndex];

View file

@ -443,7 +443,9 @@ app.get('/api/devices/:id/screenshot', (req, res) => {
if (!screenshot) return res.status(404).json({ error: 'No screenshot available' });
const safePath = path.resolve(config.screenshotsDir, path.basename(screenshot.filepath));
if (!safePath.startsWith(path.resolve(config.screenshotsDir))) return res.status(403).json({ error: 'Invalid path' });
res.sendFile(safePath);
res.sendFile(safePath, (err) => {
if (err) res.status(404).json({ error: 'Screenshot file not found on server' });
});
});
// A logged-in user who can access the content's workspace may view its file /