mirror of
https://github.com/screentinker/screentinker.git
synced 2026-05-15 07:32:23 -06:00
SEO: add meta tags, sitemap, robots.txt, comparison pages, guides, internal linking
Landing page (frontend/landing.html): - Title now includes "Self-Hosted" for that keyword - Description appended "MIT licensed." - Keywords aligned to spec (digital signage raspberry pi, digital signage android tv, video wall software, kiosk software, etc.) - SoftwareApplication JSON-LD: added applicationSubCategory "DigitalSignage", license URL, refreshed description - Image alt text + og:image:alt + twitter:image:alt now include "open-source digital signage" - New Resources section above the CTA with 6 cards linking to all new guides and comparison pages - Footer rewritten as a 5-column grid (Brand / Guides / Compare / Project / Legal) with the new internal links New SEO pages, all dark-themed, mobile-responsive, ASCII-only: - frontend/css/seo-page.css (shared nav/footer/article/table styles) - frontend/compare/yodeck-alternative.html - frontend/compare/screencloud-alternative.html - frontend/compare/optisigns-alternative.html - frontend/guides/raspberry-pi-digital-signage.html - frontend/guides/digital-signage-android-tv.html - frontend/guides/self-hosted-digital-signage.html Each new page has unique title/description/canonical, OG and Twitter card tags, BreadcrumbList JSON-LD, single h1, proper h2/h3 nesting, visible breadcrumb, comparison table or step-by-step ordered list, "Related guides" cross-link block, and a CTA. Sitemap (frontend/sitemap.xml): added all 6 new URLs with appropriate priority (0.8 for compare pages, 0.9 for guides). Existing landing (1.0) and legal pages preserved. Robots (frontend/robots.txt): allow /compare/ and /guides/, disallow /player (was previously allowed by mistake). Server (server/server.js): added explicit GET /sitemap.xml and GET /robots.txt routes ahead of the static middleware so the Content-Type is guaranteed. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
b2aa7fab54
commit
25ab1c485b
154
frontend/compare/optisigns-alternative.html
Normal file
154
frontend/compare/optisigns-alternative.html
Normal file
|
|
@ -0,0 +1,154 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<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.">
|
||||
<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">
|
||||
|
||||
<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 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="theme-color" content="#111827">
|
||||
<link rel="icon" href="/assets/icon-192.png">
|
||||
<link rel="apple-touch-icon" href="/assets/icon-192.png">
|
||||
<link rel="stylesheet" href="/css/seo-page.css">
|
||||
</head>
|
||||
<body>
|
||||
<nav>
|
||||
<div class="nav-inner">
|
||||
<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>
|
||||
</a>
|
||||
</div>
|
||||
<div class="nav-links">
|
||||
<a href="/#features">Features</a>
|
||||
<a href="/#pricing">Pricing</a>
|
||||
<a href="/#compare">Compare</a>
|
||||
<a href="/app#/login" class="btn btn-outline" style="margin-left:16px">Sign In</a>
|
||||
<a href="/app#/login" class="btn btn-primary" style="margin-left:8px">Try Free</a>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<main class="article">
|
||||
<nav class="breadcrumb" aria-label="Breadcrumb">
|
||||
<a href="/">Home</a>
|
||||
<span>/</span>
|
||||
<a href="/#compare">Compare</a>
|
||||
<span>/</span>
|
||||
<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>
|
||||
|
||||
<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, supports more platforms natively, 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>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr><td>Open source</td><td class="yes">Yes (MIT)</td><td class="no">No</td></tr>
|
||||
<tr><td>Self-host option</td><td class="yes">Yes</td><td class="no">No (cloud only)</td></tr>
|
||||
<tr><td>Free plan</td><td class="yes">1 device, 500MB</td><td class="no">14-day trial only</td></tr>
|
||||
<tr><td>Android TV / Fire TV</td><td class="yes">Yes</td><td class="yes">Yes</td></tr>
|
||||
<tr><td>Raspberry Pi</td><td class="yes">Free setup script</td><td class="partial">Limited support</td></tr>
|
||||
<tr><td>Windows / ChromeOS</td><td class="yes">Yes</td><td class="yes">Yes</td></tr>
|
||||
<tr><td>Web browser player</td><td class="yes">Yes</td><td class="partial">Limited</td></tr>
|
||||
<tr><td>Video walls</td><td class="yes">Yes (with sync)</td><td class="yes">Yes</td></tr>
|
||||
<tr><td>Multi-zone layouts</td><td class="yes">Yes</td><td class="yes">Yes</td></tr>
|
||||
<tr><td>Template library</td><td class="partial">Custom designer</td><td class="yes">Large library</td></tr>
|
||||
<tr><td>Live remote control</td><td class="yes">Yes</td><td class="partial">Screenshot only</td></tr>
|
||||
<tr><td>White-label / reseller</td><td class="yes">Yes</td><td class="yes">Yes</td></tr>
|
||||
<tr><td>Pricing for 15 devices</td><td>$99/mo Pro</td><td>~$165/mo (11 USD/screen)</td></tr>
|
||||
<tr><td>Self-host cost</td><td>Free (your server)</td><td>Not available</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<h2>Where OptiSigns does well</h2>
|
||||
<ul>
|
||||
<li><strong>Templates.</strong> Hundreds of pre-built templates for menus, real estate listings, gym schedules, and more. Best-in-class for non-designers who need to ship fast.</li>
|
||||
<li><strong>Niche features.</strong> POS integrations for restaurants, MLS feeds for real estate, fitness class schedule integrations.</li>
|
||||
<li><strong>Documentation and support.</strong> Extensive tutorial library, responsive support team.</li>
|
||||
</ul>
|
||||
|
||||
<h2>Where ScreenTinker 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>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>Built-in player on more platforms.</strong> Native Android APK, web player works on any browser, Pi setup script, Windows-friendly, macOS-friendly.</li>
|
||||
</ul>
|
||||
|
||||
<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>
|
||||
</ul>
|
||||
|
||||
<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="/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>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="cta">
|
||||
<h2>Try ScreenTinker 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>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<footer>
|
||||
<div style="color:var(--dim);font-size:13px">© 2026 ScreenTinker. All rights reserved.</div>
|
||||
<div class="links">
|
||||
<a href="https://github.com/screentinker/screentinker" target="_blank" rel="noopener">GitHub</a>
|
||||
<a href="https://discord.gg/JHWQRPaG" target="_blank" rel="noopener">Discord</a>
|
||||
<a href="/legal/terms.html">Terms</a>
|
||||
<a href="/legal/privacy.html">Privacy</a>
|
||||
<a href="/legal/third-party.html">Licenses</a>
|
||||
<a href="/app#/login">Sign In</a>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@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" }
|
||||
]
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
155
frontend/compare/screencloud-alternative.html
Normal file
155
frontend/compare/screencloud-alternative.html
Normal file
|
|
@ -0,0 +1,155 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<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.">
|
||||
<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">
|
||||
|
||||
<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 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="theme-color" content="#111827">
|
||||
<link rel="icon" href="/assets/icon-192.png">
|
||||
<link rel="apple-touch-icon" href="/assets/icon-192.png">
|
||||
<link rel="stylesheet" href="/css/seo-page.css">
|
||||
</head>
|
||||
<body>
|
||||
<nav>
|
||||
<div class="nav-inner">
|
||||
<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>
|
||||
</a>
|
||||
</div>
|
||||
<div class="nav-links">
|
||||
<a href="/#features">Features</a>
|
||||
<a href="/#pricing">Pricing</a>
|
||||
<a href="/#compare">Compare</a>
|
||||
<a href="/app#/login" class="btn btn-outline" style="margin-left:16px">Sign In</a>
|
||||
<a href="/app#/login" class="btn btn-primary" style="margin-left:8px">Try Free</a>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<main class="article">
|
||||
<nav class="breadcrumb" aria-label="Breadcrumb">
|
||||
<a href="/">Home</a>
|
||||
<span>/</span>
|
||||
<a href="/#compare">Compare</a>
|
||||
<span>/</span>
|
||||
<span>ScreenCloud Alternative</span>
|
||||
</nav>
|
||||
|
||||
<h1>Best ScreenCloud Alternative (2026): ScreenTinker 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>
|
||||
|
||||
<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>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr><td>Open source</td><td class="yes">Yes (MIT)</td><td class="no">No</td></tr>
|
||||
<tr><td>Self-host option</td><td class="yes">Yes</td><td class="no">No (cloud only)</td></tr>
|
||||
<tr><td>Free plan</td><td class="yes">1 device, 500MB</td><td class="no">14-day trial only</td></tr>
|
||||
<tr><td>Android TV / Fire TV</td><td class="yes">Yes</td><td class="yes">Yes</td></tr>
|
||||
<tr><td>Raspberry Pi</td><td class="yes">Free setup script</td><td class="yes">ScreenCloud OS</td></tr>
|
||||
<tr><td>Web browser player</td><td class="yes">Yes</td><td class="yes">Yes</td></tr>
|
||||
<tr><td>Video walls</td><td class="yes">Yes (with sync)</td><td class="yes">Yes</td></tr>
|
||||
<tr><td>Multi-zone layouts</td><td class="yes">Yes</td><td class="yes">Yes</td></tr>
|
||||
<tr><td>App integrations</td><td class="partial">Custom widgets</td><td class="yes">Built-in (Slack, Power BI, etc.)</td></tr>
|
||||
<tr><td>Live remote control</td><td class="yes">Yes</td><td class="partial">Limited</td></tr>
|
||||
<tr><td>White-label / reseller</td><td class="yes">Yes</td><td class="partial">Enterprise only</td></tr>
|
||||
<tr><td>Pricing for 5 devices</td><td>$39/mo Starter</td><td>~$108/mo</td></tr>
|
||||
<tr><td>Pricing for 15 devices</td><td>$99/mo Pro</td><td>~$300+/mo</td></tr>
|
||||
<tr><td>Self-host cost</td><td>Free (your server)</td><td>Not available</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<h2>Where ScreenCloud does well</h2>
|
||||
<ul>
|
||||
<li><strong>Native app integrations.</strong> Slack channels, Power BI dashboards, Google Drive, OneDrive, and dozens of others ship as built-in apps. If your displays show live business dashboards, this matters.</li>
|
||||
<li><strong>Enterprise polish.</strong> SOC 2 audited, dedicated account management, mature SAML/SSO support.</li>
|
||||
<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>
|
||||
<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>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>
|
||||
</ul>
|
||||
|
||||
<div class="related">
|
||||
<h2>Related guides</h2>
|
||||
<ul>
|
||||
<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>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="cta">
|
||||
<h2>Try ScreenTinker 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>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<footer>
|
||||
<div style="color:var(--dim);font-size:13px">© 2026 ScreenTinker. All rights reserved.</div>
|
||||
<div class="links">
|
||||
<a href="https://github.com/screentinker/screentinker" target="_blank" rel="noopener">GitHub</a>
|
||||
<a href="https://discord.gg/JHWQRPaG" target="_blank" rel="noopener">Discord</a>
|
||||
<a href="/legal/terms.html">Terms</a>
|
||||
<a href="/legal/privacy.html">Privacy</a>
|
||||
<a href="/legal/third-party.html">Licenses</a>
|
||||
<a href="/app#/login">Sign In</a>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@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" }
|
||||
]
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
151
frontend/compare/yodeck-alternative.html
Normal file
151
frontend/compare/yodeck-alternative.html
Normal file
|
|
@ -0,0 +1,151 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<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 supports more platforms than Yodeck. 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">
|
||||
|
||||
<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, supports more platforms. Free plan included.">
|
||||
<meta property="og:image" content="https://screentinker.com/assets/dashboard-preview.png">
|
||||
<meta property="og:site_name" content="ScreenTinker">
|
||||
|
||||
<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, supports more platforms. Free plan included.">
|
||||
<meta name="twitter:image" content="https://screentinker.com/assets/dashboard-preview.png">
|
||||
|
||||
<meta name="theme-color" content="#111827">
|
||||
<link rel="icon" href="/assets/icon-192.png">
|
||||
<link rel="apple-touch-icon" href="/assets/icon-192.png">
|
||||
<link rel="stylesheet" href="/css/seo-page.css">
|
||||
</head>
|
||||
<body>
|
||||
<nav>
|
||||
<div class="nav-inner">
|
||||
<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>
|
||||
</a>
|
||||
</div>
|
||||
<div class="nav-links">
|
||||
<a href="/#features">Features</a>
|
||||
<a href="/#pricing">Pricing</a>
|
||||
<a href="/#compare">Compare</a>
|
||||
<a href="/app#/login" class="btn btn-outline" style="margin-left:16px">Sign In</a>
|
||||
<a href="/app#/login" class="btn btn-primary" style="margin-left:8px">Try Free</a>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<main class="article">
|
||||
<nav class="breadcrumb" aria-label="Breadcrumb">
|
||||
<a href="/">Home</a>
|
||||
<span>/</span>
|
||||
<a href="/#compare">Compare</a>
|
||||
<span>/</span>
|
||||
<span>Yodeck Alternative</span>
|
||||
</nav>
|
||||
|
||||
<h1>Best Yodeck Alternative (2026): ScreenTinker 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 supports more platforms out of the box. 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>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr><td>Open source</td><td class="yes">Yes (MIT)</td><td class="no">No</td></tr>
|
||||
<tr><td>Self-host option</td><td class="yes">Yes</td><td class="no">No (cloud only)</td></tr>
|
||||
<tr><td>Free plan</td><td class="yes">1 device, 500MB</td><td class="yes">1 device</td></tr>
|
||||
<tr><td>Android TV / Fire TV</td><td class="yes">Yes</td><td class="yes">Yes</td></tr>
|
||||
<tr><td>Raspberry Pi</td><td class="yes">Free setup script</td><td class="yes">Player included on paid plans</td></tr>
|
||||
<tr><td>Windows / ChromeOS</td><td class="yes">Yes (web player)</td><td class="partial">Limited</td></tr>
|
||||
<tr><td>Web browser player</td><td class="yes">Yes</td><td class="no">No</td></tr>
|
||||
<tr><td>Video walls (multi-screen sync)</td><td class="yes">Yes</td><td class="yes">Yes</td></tr>
|
||||
<tr><td>Multi-zone layouts</td><td class="yes">Yes</td><td class="yes">Yes</td></tr>
|
||||
<tr><td>Live remote control</td><td class="yes">Yes</td><td class="partial">Screenshot only</td></tr>
|
||||
<tr><td>Kiosk / interactive mode</td><td class="yes">Yes</td><td class="partial">Add-on</td></tr>
|
||||
<tr><td>White-label / reseller</td><td class="yes">Yes</td><td class="partial">Enterprise tier</td></tr>
|
||||
<tr><td>Pricing for 15 devices</td><td>$99/mo Pro</td><td>~$120/mo (8 USD/screen)</td></tr>
|
||||
<tr><td>Self-host cost</td><td>Free (your server)</td><td>Not available</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<h2>Where Yodeck does well</h2>
|
||||
<ul>
|
||||
<li><strong>Onboarding.</strong> Yodeck ships pre-configured Pi players on paid plans, which removes a real setup step for non-technical buyers.</li>
|
||||
<li><strong>Polish.</strong> The product has been around since 2014, and the cloud experience is mature.</li>
|
||||
<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>
|
||||
<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>
|
||||
</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>
|
||||
|
||||
<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="/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>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="cta">
|
||||
<h2>Try ScreenTinker 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>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<footer>
|
||||
<div style="color:var(--dim);font-size:13px">© 2026 ScreenTinker. All rights reserved.</div>
|
||||
<div class="links">
|
||||
<a href="https://github.com/screentinker/screentinker" target="_blank" rel="noopener">GitHub</a>
|
||||
<a href="https://discord.gg/JHWQRPaG" target="_blank" rel="noopener">Discord</a>
|
||||
<a href="/legal/terms.html">Terms</a>
|
||||
<a href="/legal/privacy.html">Privacy</a>
|
||||
<a href="/legal/third-party.html">Licenses</a>
|
||||
<a href="/app#/login">Sign In</a>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@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" }
|
||||
]
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
87
frontend/css/seo-page.css
Normal file
87
frontend/css/seo-page.css
Normal file
|
|
@ -0,0 +1,87 @@
|
|||
/* Shared styles for SEO landing pages: comparison and guide pages.
|
||||
Matches the dark theme of landing.html. */
|
||||
|
||||
* { margin: 0; padding: 0; box-sizing: border-box; }
|
||||
:root { --accent:#3b82f6; --bg:#111827; --card:#1e293b; --border:#334155; --text:#f1f5f9; --muted:#94a3b8; --dim:#64748b; }
|
||||
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; background: var(--bg); color: var(--text); line-height: 1.65; }
|
||||
a { color: var(--accent); text-decoration: none; }
|
||||
a:hover { text-decoration: underline; }
|
||||
|
||||
/* Nav (matches landing.html) */
|
||||
nav { position: fixed; top: 0; left: 0; right: 0; z-index: 100; background: rgba(17,24,39,0.9); backdrop-filter: blur(12px); border-bottom: 1px solid var(--border); }
|
||||
.nav-inner { max-width: 1200px; margin: 0 auto; padding: 16px 24px; display: flex; align-items: center; justify-content: space-between; }
|
||||
.nav-logo { display: flex; align-items: center; gap: 10px; font-weight: 700; font-size: 18px; color: var(--accent); flex-shrink: 0; }
|
||||
.nav-logo a { color: var(--accent); }
|
||||
.nav-links { display: flex; align-items: center; flex-wrap: nowrap; }
|
||||
.nav-links a { color: var(--muted); margin-left: 24px; font-size: 14px; transition: color 0.2s; }
|
||||
.nav-links a:hover { color: var(--text); text-decoration: none; }
|
||||
.btn { display: inline-flex; align-items: center; gap: 8px; padding: 10px 20px; border-radius: 8px; font-weight: 600; font-size: 14px; transition: all 0.2s; border: none; cursor: pointer; }
|
||||
.btn-primary { background: var(--accent); color: white; }
|
||||
.btn-primary:hover { background: #2563eb; text-decoration: none; }
|
||||
.btn-outline { background: transparent; color: var(--accent); border: 1px solid var(--accent); }
|
||||
.btn-outline:hover { background: rgba(59,130,246,0.1); text-decoration: none; }
|
||||
|
||||
/* Article container */
|
||||
.article { max-width: 880px; margin: 0 auto; padding: 120px 24px 60px; }
|
||||
.breadcrumb { font-size: 13px; color: var(--muted); margin-bottom: 24px; }
|
||||
.breadcrumb a { color: var(--muted); }
|
||||
.breadcrumb a:hover { color: var(--text); }
|
||||
.breadcrumb span { margin: 0 8px; color: var(--dim); }
|
||||
|
||||
.article h1 { font-size: clamp(30px, 4vw, 44px); font-weight: 800; line-height: 1.2; margin-bottom: 16px; }
|
||||
.article .lead { font-size: 18px; color: var(--muted); margin-bottom: 32px; }
|
||||
.article h2 { font-size: 28px; font-weight: 700; margin: 48px 0 16px; line-height: 1.3; }
|
||||
.article h3 { font-size: 20px; font-weight: 600; margin: 28px 0 12px; }
|
||||
.article p { margin-bottom: 16px; color: var(--text); }
|
||||
.article ul, .article ol { margin: 0 0 16px 24px; color: var(--text); }
|
||||
.article li { margin-bottom: 8px; }
|
||||
.article strong { color: var(--text); font-weight: 600; }
|
||||
.article code { background: var(--card); border: 1px solid var(--border); padding: 2px 6px; border-radius: 4px; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0.9em; color: #e2e8f0; }
|
||||
.article pre { background: var(--card); border: 1px solid var(--border); padding: 16px; border-radius: 8px; overflow-x: auto; margin: 16px 0; }
|
||||
.article pre code { background: transparent; border: none; padding: 0; font-size: 13px; }
|
||||
.article blockquote { border-left: 3px solid var(--accent); padding: 8px 16px; margin: 16px 0; color: var(--muted); background: rgba(59,130,246,0.06); border-radius: 4px; }
|
||||
|
||||
/* Comparison table */
|
||||
.compare-table-wrap { width: 100%; overflow-x: auto; margin: 24px 0; -webkit-overflow-scrolling: touch; }
|
||||
.compare-table { width: 100%; border-collapse: collapse; font-size: 14px; min-width: 640px; }
|
||||
.compare-table th, .compare-table td { padding: 12px 16px; text-align: left; border-bottom: 1px solid var(--border); }
|
||||
.compare-table th { color: var(--text); font-weight: 600; background: var(--card); }
|
||||
.compare-table td:first-child { color: var(--muted); }
|
||||
.compare-table .yes { color: #22c55e; font-weight: 600; }
|
||||
.compare-table .no { color: #ef4444; }
|
||||
.compare-table .partial { color: #f59e0b; }
|
||||
.compare-table tbody tr:hover { background: rgba(59,130,246,0.04); }
|
||||
|
||||
/* CTA */
|
||||
.cta { text-align: center; padding: 60px 24px; background: linear-gradient(135deg, rgba(59,130,246,0.1), rgba(139,92,246,0.1)); border-top: 1px solid var(--border); border-bottom: 1px solid var(--border); margin: 48px 0; border-radius: 12px; }
|
||||
.cta h2 { font-size: 28px; margin: 0 0 12px; }
|
||||
.cta p { color: var(--muted); margin-bottom: 20px; font-size: 17px; }
|
||||
|
||||
/* Related links / internal linking block */
|
||||
.related { background: var(--card); border: 1px solid var(--border); border-radius: 12px; padding: 24px; margin: 32px 0; }
|
||||
.related h2 { margin: 0 0 12px; font-size: 20px; }
|
||||
.related ul { margin: 0; list-style: none; }
|
||||
.related li { margin: 8px 0; padding-left: 0; }
|
||||
.related li::before { content: '> '; color: var(--accent); font-weight: 700; }
|
||||
|
||||
/* Footer (matches landing.html) */
|
||||
footer { max-width: 1200px; margin: 0 auto; padding: 40px 24px; display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 16px; border-top: 1px solid var(--border); }
|
||||
footer .links a { color: var(--dim); margin-left: 16px; font-size: 13px; }
|
||||
footer .links a:hover { color: var(--text); text-decoration: none; }
|
||||
|
||||
/* Mobile */
|
||||
@media (max-width: 768px) {
|
||||
.nav-links a:not(.btn) { display: none; }
|
||||
.nav-inner { padding: 12px 14px; gap: 8px; }
|
||||
.nav-links .btn { padding: 8px 12px; font-size: 13px; margin-left: 8px; flex-shrink: 0; min-height: 0; }
|
||||
.btn { min-height: 44px; }
|
||||
.article { padding: 100px 16px 40px; }
|
||||
.cta { padding: 40px 16px; }
|
||||
footer { flex-direction: column; text-align: center; }
|
||||
footer .links a { margin: 4px 8px; }
|
||||
.compare-table { font-size: 12px; }
|
||||
.compare-table th, .compare-table td { padding: 8px; }
|
||||
}
|
||||
@media (max-width: 420px) {
|
||||
.nav-logo-text { display: none; }
|
||||
}
|
||||
157
frontend/guides/digital-signage-android-tv.html
Normal file
157
frontend/guides/digital-signage-android-tv.html
Normal file
|
|
@ -0,0 +1,157 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<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.">
|
||||
<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">
|
||||
|
||||
<meta property="og:type" content="article">
|
||||
<meta property="og:url" content="https://screentinker.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 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="theme-color" content="#111827">
|
||||
<link rel="icon" href="/assets/icon-192.png">
|
||||
<link rel="apple-touch-icon" href="/assets/icon-192.png">
|
||||
<link rel="stylesheet" href="/css/seo-page.css">
|
||||
</head>
|
||||
<body>
|
||||
<nav>
|
||||
<div class="nav-inner">
|
||||
<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>
|
||||
</a>
|
||||
</div>
|
||||
<div class="nav-links">
|
||||
<a href="/#features">Features</a>
|
||||
<a href="/#pricing">Pricing</a>
|
||||
<a href="/#compare">Compare</a>
|
||||
<a href="/app#/login" class="btn btn-outline" style="margin-left:16px">Sign In</a>
|
||||
<a href="/app#/login" class="btn btn-primary" style="margin-left:8px">Try Free</a>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<main class="article">
|
||||
<nav class="breadcrumb" aria-label="Breadcrumb">
|
||||
<a href="/">Home</a>
|
||||
<span>/</span>
|
||||
<a href="/#features">Guides</a>
|
||||
<span>/</span>
|
||||
<span>Android TV & Fire TV Signage</span>
|
||||
</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>
|
||||
|
||||
<h2>What works</h2>
|
||||
<ul>
|
||||
<li><strong>Android TV</strong> (Sony, Hisense, Philips, Onn, NVIDIA Shield, generic Android TV boxes)</li>
|
||||
<li><strong>Amazon Fire TV / Fire Stick</strong> (4K, 4K Max, Cube)</li>
|
||||
<li><strong>Apolosign signage players</strong> (Android-based commercial signage hardware)</li>
|
||||
<li><strong>Tablets running Android 8+</strong> mounted as in-store displays</li>
|
||||
</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>
|
||||
|
||||
<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>
|
||||
|
||||
<h3>On Fire TV / Fire Stick</h3>
|
||||
<p>Install <strong>Downloader</strong> from the Amazon App Store. In Settings > My Fire TV > Developer Options, enable <strong>Apps from Unknown Sources</strong>. Open Downloader, enter <code>https://screentinker.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>
|
||||
<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>
|
||||
|
||||
<h2>Step 4: Push content</h2>
|
||||
<p>Same as any other ScreenTinker display:</p>
|
||||
<ol>
|
||||
<li>Upload media in the <strong>Content Library</strong></li>
|
||||
<li>Build a <strong>Playlist</strong></li>
|
||||
<li>Publish the playlist and assign it to your device</li>
|
||||
</ol>
|
||||
|
||||
<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 > 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>
|
||||
</ul>
|
||||
|
||||
<h2>Hardware recommendations</h2>
|
||||
<ul>
|
||||
<li><strong>Lowest cost:</strong> Amazon Fire TV Stick 4K. ~$50 and works fine for image and 1080p video playlists.</li>
|
||||
<li><strong>Best value:</strong> Onn 4K Streaming Box. ~$30 at Walmart and runs Android TV stock.</li>
|
||||
<li><strong>Commercial:</strong> Apolosign players. Ship with built-in mount, real-time clock, and HDMI-CEC for power management. Recommended for production deployments.</li>
|
||||
<li><strong>Highest performance:</strong> NVIDIA Shield TV. Overkill for signage but bulletproof.</li>
|
||||
</ul>
|
||||
|
||||
<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/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>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="cta">
|
||||
<h2>Ready to deploy?</h2>
|
||||
<p>Free plan supports 1 device. Pro trial unlocks 15 devices for 14 days, no credit card.</p>
|
||||
<a href="/app#/login" class="btn btn-primary" style="padding:14px 28px;font-size:16px">Start Free</a>
|
||||
<a href="/download/apk" class="btn btn-outline" style="padding:14px 28px;font-size:16px;margin-left:12px">Download APK</a>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<footer>
|
||||
<div style="color:var(--dim);font-size:13px">© 2026 ScreenTinker. All rights reserved.</div>
|
||||
<div class="links">
|
||||
<a href="https://github.com/screentinker/screentinker" target="_blank" rel="noopener">GitHub</a>
|
||||
<a href="https://discord.gg/JHWQRPaG" target="_blank" rel="noopener">Discord</a>
|
||||
<a href="/legal/terms.html">Terms</a>
|
||||
<a href="/legal/privacy.html">Privacy</a>
|
||||
<a href="/legal/third-party.html">Licenses</a>
|
||||
<a href="/app#/login">Sign In</a>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@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/#features" },
|
||||
{ "@type": "ListItem", "position": 3, "name": "Android TV and Fire TV Signage", "item": "https://screentinker.com/guides/digital-signage-android-tv.html" }
|
||||
]
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
167
frontend/guides/raspberry-pi-digital-signage.html
Normal file
167
frontend/guides/raspberry-pi-digital-signage.html
Normal file
|
|
@ -0,0 +1,167 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<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.">
|
||||
<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">
|
||||
|
||||
<meta property="og:type" content="article">
|
||||
<meta property="og:url" content="https://screentinker.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 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="theme-color" content="#111827">
|
||||
<link rel="icon" href="/assets/icon-192.png">
|
||||
<link rel="apple-touch-icon" href="/assets/icon-192.png">
|
||||
<link rel="stylesheet" href="/css/seo-page.css">
|
||||
</head>
|
||||
<body>
|
||||
<nav>
|
||||
<div class="nav-inner">
|
||||
<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>
|
||||
</a>
|
||||
</div>
|
||||
<div class="nav-links">
|
||||
<a href="/#features">Features</a>
|
||||
<a href="/#pricing">Pricing</a>
|
||||
<a href="/#compare">Compare</a>
|
||||
<a href="/app#/login" class="btn btn-outline" style="margin-left:16px">Sign In</a>
|
||||
<a href="/app#/login" class="btn btn-primary" style="margin-left:8px">Try Free</a>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<main class="article">
|
||||
<nav class="breadcrumb" aria-label="Breadcrumb">
|
||||
<a href="/">Home</a>
|
||||
<span>/</span>
|
||||
<a href="/#features">Guides</a>
|
||||
<span>/</span>
|
||||
<span>Raspberry Pi Digital Signage</span>
|
||||
</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>
|
||||
|
||||
<h2>What you will need</h2>
|
||||
<ul>
|
||||
<li><strong>Raspberry Pi 3, Pi 4, or Pi 5.</strong> Pi 4 (4GB+) is the sweet spot. Pi 3 works for static images and 1080p video. Pi 5 is overkill but futureproof.</li>
|
||||
<li><strong>microSD card,</strong> 16 GB or larger. Class 10 or A1/A2 rated.</li>
|
||||
<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>
|
||||
</ul>
|
||||
|
||||
<h2>Step 1: Install Raspberry Pi OS</h2>
|
||||
<p>Use <a href="https://www.raspberrypi.com/software/" target="_blank" rel="noopener">Raspberry Pi Imager</a> to flash <strong>Raspberry Pi OS (64-bit)</strong> to your microSD card. Choose the standard Desktop edition (not Lite - we need a desktop environment for the browser).</p>
|
||||
<p>In the Imager's advanced options (gear icon), pre-set:</p>
|
||||
<ul>
|
||||
<li>Hostname (e.g. <code>signage-lobby</code>)</li>
|
||||
<li>Username and password</li>
|
||||
<li>Wi-Fi credentials (if not using Ethernet)</li>
|
||||
<li>Enable SSH (optional but useful for remote management)</li>
|
||||
</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>
|
||||
<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>
|
||||
<p>The script will:</p>
|
||||
<ul>
|
||||
<li>Install Chromium (the kiosk browser used as the player)</li>
|
||||
<li>Set up an autostart entry so the player launches in fullscreen on boot</li>
|
||||
<li>Disable screen blanking and the screensaver</li>
|
||||
<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>
|
||||
|
||||
<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>
|
||||
|
||||
<h2>Step 4: Push content</h2>
|
||||
<p>From the dashboard:</p>
|
||||
<ol>
|
||||
<li>Open <strong>Content Library</strong> and upload an image, video, or paste a remote URL.</li>
|
||||
<li>Open <strong>Playlists</strong>, create a playlist, and add items.</li>
|
||||
<li>Publish the playlist.</li>
|
||||
<li>From the device's detail page, assign the playlist.</li>
|
||||
</ol>
|
||||
<p>The Pi picks up the new playlist within a few seconds and starts playing.</p>
|
||||
|
||||
<h2>Performance tips</h2>
|
||||
<ul>
|
||||
<li><strong>Use H.264 video.</strong> Pi GPUs accelerate H.264 in hardware. H.265/HEVC works on Pi 4/5 but uses more CPU.</li>
|
||||
<li><strong>Match your resolution to the display.</strong> 1080p video on a 1080p screen avoids unnecessary scaling.</li>
|
||||
<li><strong>Wired Ethernet is more reliable than Wi-Fi</strong> for video-heavy playlists. Wi-Fi is fine for image-heavy ones.</li>
|
||||
<li><strong>For Pi 3,</strong> stick to images and short clips. Pi 3 can struggle with continuous 1080p video.</li>
|
||||
</ul>
|
||||
|
||||
<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>
|
||||
|
||||
<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>
|
||||
|
||||
<h3>The Pi shows the pairing code but I can't see it on the dashboard</h3>
|
||||
<p>The pairing code is shown on the Pi screen, not the dashboard. Sign in, click Add Display, and type the code from the Pi.</p>
|
||||
|
||||
<div class="related">
|
||||
<h2>Related guides</h2>
|
||||
<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>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="cta">
|
||||
<h2>Ready to set up your Pi?</h2>
|
||||
<p>Start a free ScreenTinker 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>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<footer>
|
||||
<div style="color:var(--dim);font-size:13px">© 2026 ScreenTinker. All rights reserved.</div>
|
||||
<div class="links">
|
||||
<a href="https://github.com/screentinker/screentinker" target="_blank" rel="noopener">GitHub</a>
|
||||
<a href="https://discord.gg/JHWQRPaG" target="_blank" rel="noopener">Discord</a>
|
||||
<a href="/legal/terms.html">Terms</a>
|
||||
<a href="/legal/privacy.html">Privacy</a>
|
||||
<a href="/legal/third-party.html">Licenses</a>
|
||||
<a href="/app#/login">Sign In</a>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@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/#features" },
|
||||
{ "@type": "ListItem", "position": 3, "name": "Raspberry Pi Digital Signage", "item": "https://screentinker.com/guides/raspberry-pi-digital-signage.html" }
|
||||
]
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
196
frontend/guides/self-hosted-digital-signage.html
Normal file
196
frontend/guides/self-hosted-digital-signage.html
Normal file
|
|
@ -0,0 +1,196 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<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.">
|
||||
<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">
|
||||
|
||||
<meta property="og:type" content="article">
|
||||
<meta property="og:url" content="https://screentinker.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 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="theme-color" content="#111827">
|
||||
<link rel="icon" href="/assets/icon-192.png">
|
||||
<link rel="apple-touch-icon" href="/assets/icon-192.png">
|
||||
<link rel="stylesheet" href="/css/seo-page.css">
|
||||
</head>
|
||||
<body>
|
||||
<nav>
|
||||
<div class="nav-inner">
|
||||
<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>
|
||||
</a>
|
||||
</div>
|
||||
<div class="nav-links">
|
||||
<a href="/#features">Features</a>
|
||||
<a href="/#pricing">Pricing</a>
|
||||
<a href="/#compare">Compare</a>
|
||||
<a href="/app#/login" class="btn btn-outline" style="margin-left:16px">Sign In</a>
|
||||
<a href="/app#/login" class="btn btn-primary" style="margin-left:8px">Try Free</a>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<main class="article">
|
||||
<nav class="breadcrumb" aria-label="Breadcrumb">
|
||||
<a href="/">Home</a>
|
||||
<span>/</span>
|
||||
<a href="/#features">Guides</a>
|
||||
<span>/</span>
|
||||
<span>Self-Hosted Digital Signage</span>
|
||||
</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>
|
||||
|
||||
<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>
|
||||
<ul>
|
||||
<li><strong>Data sovereignty.</strong> Healthcare, finance, government, and education often cannot put internal information into a third-party cloud. Self-hosting keeps content, schedules, and access logs on your network.</li>
|
||||
<li><strong>Cost control.</strong> Per-screen monthly fees stack up fast. Self-hosting trades that for a fixed server cost - typically $5 to $50 per month for a small VPS that can run hundreds of screens.</li>
|
||||
<li><strong>Network isolation.</strong> Some deployments live on private LANs with no internet access at all. Self-hosting is the only way to manage signage in those environments.</li>
|
||||
<li><strong>No vendor lock-in.</strong> If the cloud vendor disappears, raises prices 3x, or pivots away from your use case, your deployment goes with them. Self-hosters control their own roadmap.</li>
|
||||
<li><strong>Customization.</strong> Open source self-hosted means you can fork the code, add a custom widget, or wire it into your existing systems.</li>
|
||||
</ul>
|
||||
|
||||
<h2>What you need</h2>
|
||||
<h3>Hardware / VPS</h3>
|
||||
<p>A modest Linux server is enough for most deployments:</p>
|
||||
<ul>
|
||||
<li><strong>Up to 25 displays:</strong> 1 vCPU, 1 GB RAM, 20 GB disk. ~$5/month on Hetzner, DigitalOcean, or Vultr.</li>
|
||||
<li><strong>25-100 displays:</strong> 2 vCPU, 2 GB RAM, 40 GB disk. ~$12-20/month.</li>
|
||||
<li><strong>100+ displays:</strong> 4+ vCPU, 4+ GB RAM, faster disk. Plan for content storage at ~50-200 MB per screen depending on media volume.</li>
|
||||
</ul>
|
||||
<p>An on-prem VM works just as well as a cloud VPS - in fact, on-prem is often the whole point.</p>
|
||||
|
||||
<h3>Software prerequisites</h3>
|
||||
<ul>
|
||||
<li>Ubuntu 22.04 or 24.04 LTS (Debian 12 also works)</li>
|
||||
<li>Node.js 18 or newer</li>
|
||||
<li>A domain name pointed at your server (or just an internal hostname / IP for LAN deployments)</li>
|
||||
<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
|
||||
npm install
|
||||
cp .env.example .env
|
||||
# edit .env with your domain, JWT_SECRET, and SELF_HOSTED=true
|
||||
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>
|
||||
<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>
|
||||
<pre><code>[Unit]
|
||||
Description=ScreenTinker Digital Signage Server
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
WorkingDirectory=/opt/screentinker/server
|
||||
ExecStart=/usr/bin/node server.js
|
||||
EnvironmentFile=/opt/screentinker/.env
|
||||
Restart=always
|
||||
User=screentinker
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target</code></pre>
|
||||
<p>Enable with <code>systemctl enable --now screentinker</code>.</p>
|
||||
|
||||
<h2>Backups</h2>
|
||||
<p>The state lives in two places:</p>
|
||||
<ul>
|
||||
<li><code>server/db/remote_display.db</code> - SQLite database of users, devices, playlists, schedules</li>
|
||||
<li><code>server/uploads/</code> - uploaded media (images, videos, thumbnails)</li>
|
||||
</ul>
|
||||
<p>A nightly tarball of those two paths gives you a full restore point. Pair with offsite sync (rclone, restic) for disaster recovery.</p>
|
||||
|
||||
<h2>Self-hosted vs cloud-hosted comparison</h2>
|
||||
<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>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr><td>Data location</td><td>Your server</td><td>Vendor's cloud</td></tr>
|
||||
<tr><td>Recurring per-screen cost</td><td>None</td><td>$5-15/screen/month</td></tr>
|
||||
<tr><td>Server cost</td><td>$5-50/month flat</td><td>None (included)</td></tr>
|
||||
<tr><td>Internet required for management</td><td>No (LAN works)</td><td>Yes</td></tr>
|
||||
<tr><td>Source code access</td><td>Yes (MIT)</td><td>Closed</td></tr>
|
||||
<tr><td>Air-gapped deployment</td><td>Possible</td><td>Not possible</td></tr>
|
||||
<tr><td>Vendor lock-in risk</td><td>None (you own it)</td><td>High</td></tr>
|
||||
<tr><td>Update / patch responsibility</td><td>Yours</td><td>Vendor</td></tr>
|
||||
<tr><td>Initial setup time</td><td>~1 hour</td><td>~5 minutes</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</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>
|
||||
|
||||
<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>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="cta">
|
||||
<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>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<footer>
|
||||
<div style="color:var(--dim);font-size:13px">© 2026 ScreenTinker. All rights reserved.</div>
|
||||
<div class="links">
|
||||
<a href="https://github.com/screentinker/screentinker" target="_blank" rel="noopener">GitHub</a>
|
||||
<a href="https://discord.gg/JHWQRPaG" target="_blank" rel="noopener">Discord</a>
|
||||
<a href="/legal/terms.html">Terms</a>
|
||||
<a href="/legal/privacy.html">Privacy</a>
|
||||
<a href="/legal/third-party.html">Licenses</a>
|
||||
<a href="/app#/login">Sign In</a>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@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/#features" },
|
||||
{ "@type": "ListItem", "position": 3, "name": "Self-Hosted Digital Signage", "item": "https://screentinker.com/guides/self-hosted-digital-signage.html" }
|
||||
]
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -5,9 +5,9 @@
|
|||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
|
||||
<!-- Primary SEO -->
|
||||
<title>ScreenTinker - Open-Source Digital Signage CMS | Free Display Management</title>
|
||||
<meta name="description" content="Open-source digital signage CMS. Free plan, self-host or cloud. Manage TVs, video walls, kiosks, and schedules across Android, Raspberry Pi, Windows, and any browser.">
|
||||
<meta name="keywords" content="open source digital signage, free digital signage software, digital signage CMS, display management software, screen management, signage player, TV display management, video wall, kiosk mode, Raspberry Pi signage, self-hosted signage">
|
||||
<title>ScreenTinker - Self-Hosted Open-Source Digital Signage CMS | Free Display Management</title>
|
||||
<meta name="description" content="Open-source digital signage CMS. Free plan, self-host or cloud. Manage TVs, video walls, kiosks, and schedules across Android, Raspberry Pi, Windows, and any browser. MIT licensed.">
|
||||
<meta name="keywords" content="digital signage, open source digital signage, self hosted signage, digital signage cms, free digital signage software, digital signage raspberry pi, digital signage android tv, video wall software, kiosk software, screen management">
|
||||
<meta name="author" content="ScreenTinker">
|
||||
<meta name="robots" content="index, follow">
|
||||
<link rel="canonical" href="https://screentinker.com/">
|
||||
|
|
@ -20,7 +20,7 @@
|
|||
<meta property="og:image" content="https://screentinker.com/assets/dashboard-preview.png">
|
||||
<meta property="og:image:width" content="2500">
|
||||
<meta property="og:image:height" content="1314">
|
||||
<meta property="og:image:alt" content="ScreenTinker dashboard showing four online displays with playlist assignments">
|
||||
<meta property="og:image:alt" content="ScreenTinker open-source digital signage dashboard showing four online displays with playlist assignments">
|
||||
<meta property="og:site_name" content="ScreenTinker">
|
||||
|
||||
<!-- Twitter -->
|
||||
|
|
@ -28,7 +28,7 @@
|
|||
<meta name="twitter:title" content="ScreenTinker - Open-Source Digital Signage CMS">
|
||||
<meta name="twitter:description" content="Open-source digital signage CMS. Free plan, self-host or cloud. Video walls, kiosks, scheduling, and live remote control across 9 platforms.">
|
||||
<meta name="twitter:image" content="https://screentinker.com/assets/dashboard-preview.png">
|
||||
<meta name="twitter:image:alt" content="ScreenTinker dashboard showing four online displays with playlist assignments">
|
||||
<meta name="twitter:image:alt" content="ScreenTinker open-source digital signage dashboard showing four online displays with playlist assignments">
|
||||
|
||||
<!-- Theme -->
|
||||
<meta name="theme-color" content="#111827">
|
||||
|
|
@ -192,7 +192,7 @@
|
|||
|
||||
<!-- Dashboard preview -->
|
||||
<div class="screenshot">
|
||||
<img src="/assets/dashboard-preview.png" alt="ScreenTinker dashboard showing 4 online displays with playlist assignments" loading="lazy" width="2500" height="1314">
|
||||
<img src="/assets/dashboard-preview.png" alt="ScreenTinker open-source digital signage dashboard showing 4 online displays with playlist assignments" loading="lazy" width="2500" height="1314">
|
||||
</div>
|
||||
|
||||
<!-- Open Source callout -->
|
||||
|
|
@ -276,6 +276,44 @@
|
|||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Resources / internal linking for SEO -->
|
||||
<section class="resources" id="resources" style="max-width:1000px;margin:0 auto;padding:60px 24px;">
|
||||
<h2 style="text-align:center;font-size:32px;margin-bottom:8px">Resources</h2>
|
||||
<p style="text-align:center;color:var(--muted);margin-bottom:32px">Setup guides and honest comparisons.</p>
|
||||
<div style="display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:16px">
|
||||
<a href="/guides/raspberry-pi-digital-signage.html" style="display:block;background:var(--card);border:1px solid var(--border);border-radius:10px;padding:20px;color:var(--text);transition:border-color 0.2s">
|
||||
<div style="font-size:12px;color:var(--accent);text-transform:uppercase;letter-spacing:0.5px;margin-bottom:6px">Guide</div>
|
||||
<div style="font-weight:600;margin-bottom:4px">How to set up digital signage on Raspberry Pi</div>
|
||||
<div style="font-size:13px;color:var(--muted)">Hardware, OS, install script, pairing.</div>
|
||||
</a>
|
||||
<a href="/guides/digital-signage-android-tv.html" style="display:block;background:var(--card);border:1px solid var(--border);border-radius:10px;padding:20px;color:var(--text);transition:border-color 0.2s">
|
||||
<div style="font-size:12px;color:var(--accent);text-transform:uppercase;letter-spacing:0.5px;margin-bottom:6px">Guide</div>
|
||||
<div style="font-weight:600;margin-bottom:4px">Free digital signage for Android TV & Fire TV</div>
|
||||
<div style="font-size:13px;color:var(--muted)">APK sideload, kiosk mode, hardware tips.</div>
|
||||
</a>
|
||||
<a href="/guides/self-hosted-digital-signage.html" style="display:block;background:var(--card);border:1px solid var(--border);border-radius:10px;padding:20px;color:var(--text);transition:border-color 0.2s">
|
||||
<div style="font-size:12px;color:var(--accent);text-transform:uppercase;letter-spacing:0.5px;margin-bottom:6px">Guide</div>
|
||||
<div style="font-weight:600;margin-bottom:4px">Self-hosted digital signage guide</div>
|
||||
<div style="font-size:13px;color:var(--muted)">Sizing, deploy, TLS, backups.</div>
|
||||
</a>
|
||||
<a href="/compare/yodeck-alternative.html" style="display:block;background:var(--card);border:1px solid var(--border);border-radius:10px;padding:20px;color:var(--text);transition:border-color 0.2s">
|
||||
<div style="font-size:12px;color:var(--accent);text-transform:uppercase;letter-spacing:0.5px;margin-bottom:6px">Compare</div>
|
||||
<div style="font-weight:600;margin-bottom:4px">ScreenTinker vs Yodeck</div>
|
||||
<div style="font-size:13px;color:var(--muted)">Features, pricing, platform support.</div>
|
||||
</a>
|
||||
<a href="/compare/screencloud-alternative.html" style="display:block;background:var(--card);border:1px solid var(--border);border-radius:10px;padding:20px;color:var(--text);transition:border-color 0.2s">
|
||||
<div style="font-size:12px;color:var(--accent);text-transform:uppercase;letter-spacing:0.5px;margin-bottom:6px">Compare</div>
|
||||
<div style="font-weight:600;margin-bottom:4px">ScreenTinker vs ScreenCloud</div>
|
||||
<div style="font-size:13px;color:var(--muted)">Pricing breakdown at scale.</div>
|
||||
</a>
|
||||
<a href="/compare/optisigns-alternative.html" style="display:block;background:var(--card);border:1px solid var(--border);border-radius:10px;padding:20px;color:var(--text);transition:border-color 0.2s">
|
||||
<div style="font-size:12px;color:var(--accent);text-transform:uppercase;letter-spacing:0.5px;margin-bottom:6px">Compare</div>
|
||||
<div style="font-weight:600;margin-bottom:4px">ScreenTinker vs OptiSigns</div>
|
||||
<div style="font-size:13px;color:var(--muted)">Side by side feature and price comparison.</div>
|
||||
</a>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- CTA -->
|
||||
<section class="cta">
|
||||
<h2>Ready to Get Started?</h2>
|
||||
|
|
@ -285,18 +323,50 @@
|
|||
</main>
|
||||
|
||||
<!-- Footer -->
|
||||
<footer>
|
||||
<div style="color:var(--dim);font-size:13px">© 2026 ScreenTinker. All rights reserved.</div>
|
||||
<div class="links">
|
||||
<a href="https://github.com/screentinker/screentinker" target="_blank" rel="noopener">GitHub</a>
|
||||
<a href="https://discord.gg/JHWQRPaG" target="_blank" rel="noopener">Discord</a>
|
||||
<a href="/legal/terms.html">Terms</a>
|
||||
<a href="/legal/privacy.html">Privacy</a>
|
||||
<a href="/legal/third-party.html">Licenses</a>
|
||||
<a href="/api/status" target="_blank">Status</a>
|
||||
<a href="/app#/login">Sign In</a>
|
||||
<div style="border-top:1px solid var(--border);background:rgba(15,23,42,0.4)">
|
||||
<div style="max-width:1200px;margin:0 auto;padding:48px 24px 24px;display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:32px">
|
||||
<div>
|
||||
<div style="font-weight:700;color:var(--accent);margin-bottom:12px">ScreenTinker</div>
|
||||
<div style="font-size:13px;color:var(--muted);line-height:1.6">Open-source digital signage. Free plan, self-host or cloud. MIT licensed.</div>
|
||||
</div>
|
||||
<div>
|
||||
<div style="font-size:13px;font-weight:600;color:var(--text);margin-bottom:10px;text-transform:uppercase;letter-spacing:0.5px">Guides</div>
|
||||
<div style="display:flex;flex-direction:column;gap:6px;font-size:13px">
|
||||
<a href="/guides/raspberry-pi-digital-signage.html" style="color:var(--muted)">Raspberry Pi setup</a>
|
||||
<a href="/guides/digital-signage-android-tv.html" style="color:var(--muted)">Android TV & Fire TV</a>
|
||||
<a href="/guides/self-hosted-digital-signage.html" style="color:var(--muted)">Self-hosting guide</a>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<div style="font-size:13px;font-weight:600;color:var(--text);margin-bottom:10px;text-transform:uppercase;letter-spacing:0.5px">Compare</div>
|
||||
<div style="display:flex;flex-direction:column;gap:6px;font-size:13px">
|
||||
<a href="/compare/yodeck-alternative.html" style="color:var(--muted)">vs Yodeck</a>
|
||||
<a href="/compare/screencloud-alternative.html" style="color:var(--muted)">vs ScreenCloud</a>
|
||||
<a href="/compare/optisigns-alternative.html" style="color:var(--muted)">vs OptiSigns</a>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<div style="font-size:13px;font-weight:600;color:var(--text);margin-bottom:10px;text-transform:uppercase;letter-spacing:0.5px">Project</div>
|
||||
<div style="display:flex;flex-direction:column;gap:6px;font-size:13px">
|
||||
<a href="https://github.com/screentinker/screentinker" target="_blank" rel="noopener" style="color:var(--muted)">GitHub</a>
|
||||
<a href="https://discord.gg/JHWQRPaG" target="_blank" rel="noopener" style="color:var(--muted)">Discord</a>
|
||||
<a href="/api/status" target="_blank" style="color:var(--muted)">Status</a>
|
||||
<a href="/app#/login" style="color:var(--muted)">Sign in</a>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<div style="font-size:13px;font-weight:600;color:var(--text);margin-bottom:10px;text-transform:uppercase;letter-spacing:0.5px">Legal</div>
|
||||
<div style="display:flex;flex-direction:column;gap:6px;font-size:13px">
|
||||
<a href="/legal/terms.html" style="color:var(--muted)">Terms</a>
|
||||
<a href="/legal/privacy.html" style="color:var(--muted)">Privacy</a>
|
||||
<a href="/legal/third-party.html" style="color:var(--muted)">Licenses</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div style="max-width:1200px;margin:0 auto;padding:16px 24px 32px;border-top:1px solid var(--border);color:var(--dim);font-size:13px;text-align:center">
|
||||
© 2026 ScreenTinker. All rights reserved.
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<!-- Structured Data for Google -->
|
||||
<script type="application/ld+json">
|
||||
|
|
@ -305,9 +375,11 @@
|
|||
"@type": "SoftwareApplication",
|
||||
"name": "ScreenTinker",
|
||||
"applicationCategory": "BusinessApplication",
|
||||
"applicationSubCategory": "DigitalSignage",
|
||||
"operatingSystem": "Android, Web, Windows, Linux, ChromeOS",
|
||||
"description": "Digital signage management software with remote control, video walls, multi-zone layouts, scheduling, kiosk mode, and analytics. Works on 9 platforms.",
|
||||
"description": "Self-hosted, open-source digital signage CMS. MIT licensed. Manage TVs, video walls, kiosks, and content schedules across Android, Raspberry Pi, Windows, ChromeOS, and any browser.",
|
||||
"url": "https://screentinker.com",
|
||||
"license": "https://opensource.org/license/mit",
|
||||
"offers": [
|
||||
{
|
||||
"@type": "Offer",
|
||||
|
|
|
|||
|
|
@ -1,10 +1,12 @@
|
|||
User-agent: *
|
||||
Allow: /
|
||||
Allow: /legal/
|
||||
Allow: /player/
|
||||
Allow: /compare/
|
||||
Allow: /guides/
|
||||
|
||||
Disallow: /api/
|
||||
Disallow: /app
|
||||
Disallow: /player
|
||||
Disallow: /uploads/
|
||||
Disallow: /scripts/
|
||||
|
||||
|
|
|
|||
|
|
@ -5,6 +5,36 @@
|
|||
<changefreq>weekly</changefreq>
|
||||
<priority>1.0</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://screentinker.com/compare/yodeck-alternative.html</loc>
|
||||
<changefreq>monthly</changefreq>
|
||||
<priority>0.8</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://screentinker.com/compare/screencloud-alternative.html</loc>
|
||||
<changefreq>monthly</changefreq>
|
||||
<priority>0.8</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://screentinker.com/compare/optisigns-alternative.html</loc>
|
||||
<changefreq>monthly</changefreq>
|
||||
<priority>0.8</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://screentinker.com/guides/raspberry-pi-digital-signage.html</loc>
|
||||
<changefreq>monthly</changefreq>
|
||||
<priority>0.9</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://screentinker.com/guides/digital-signage-android-tv.html</loc>
|
||||
<changefreq>monthly</changefreq>
|
||||
<priority>0.9</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://screentinker.com/guides/self-hosted-digital-signage.html</loc>
|
||||
<changefreq>monthly</changefreq>
|
||||
<priority>0.9</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://screentinker.com/legal/terms.html</loc>
|
||||
<changefreq>monthly</changefreq>
|
||||
|
|
|
|||
|
|
@ -143,6 +143,19 @@ app.get('/app', (req, res) => {
|
|||
res.sendFile(path.join(config.frontendDir, 'index.html'));
|
||||
});
|
||||
|
||||
// Sitemap and robots — served explicitly so the Content-Type is guaranteed
|
||||
// and these endpoints are immune to any future static-middleware reshuffle.
|
||||
app.get('/sitemap.xml', (req, res) => {
|
||||
res.type('application/xml');
|
||||
res.setHeader('Cache-Control', 'public, max-age=3600'); // 1h, sitemap rarely changes
|
||||
res.sendFile(path.join(config.frontendDir, 'sitemap.xml'));
|
||||
});
|
||||
app.get('/robots.txt', (req, res) => {
|
||||
res.type('text/plain');
|
||||
res.setHeader('Cache-Control', 'public, max-age=3600');
|
||||
res.sendFile(path.join(config.frontendDir, 'robots.txt'));
|
||||
});
|
||||
|
||||
// Serve frontend static files
|
||||
// JS/CSS/HTML: no-cache (always revalidate, uses ETag/304)
|
||||
// Images/fonts/icons: long cache for Cloudflare + browser
|
||||
|
|
|
|||
Loading…
Reference in a new issue