# Self-Hosted Digital Signage Software

> Why and how to self-host your digital signage CMS. Data privacy, cost control, and no recurring fees. Complete deployment guide.

Source: https://screentinker.com/guides/self-hosted-digital-signage

## Self-Hosted Digital Signage Software: Complete Guide (2026)

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.

### Why self-host digital signage?

Most digital signage products are cloud-only. That works for many businesses, but there are real reasons to keep the server in-house:

- **Data sovereignty.** 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.

- **Cost control.** 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.

- **Network isolation.** Some deployments live on private LANs with no internet access at all. Self-hosting is the only way to manage signage in those environments.

- **No vendor lock-in.** 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.

- **Customization.** Open source self-hosted means you can fork the code, add a custom widget, or wire it into your existing systems.

### What you need

#### Hardware / VPS

A modest Linux server is enough for most deployments:

- **Up to 25 displays:** 1 vCPU, 1 GB RAM, 20 GB disk. ~$5/month on Hetzner, DigitalOcean, or Vultr.

- **25-100 displays:** 2 vCPU, 2 GB RAM, 40 GB disk. ~$12-20/month.

- **100+ displays:** 4+ vCPU, 4+ GB RAM, faster disk. Plan for content storage at ~50-200 MB per screen depending on media volume.

An on-prem VM works just as well as a cloud VPS - in fact, on-prem is often the whole point.

#### Software prerequisites

- Ubuntu 22.04 or 24.04 LTS (Debian 12 also works)

- Node.js 18 or newer

- A domain name pointed at your server (or just an internal hostname / IP for LAN deployments)

- SSL certificate (Let's Encrypt is free; or self-signed for LAN)

### Deploying ScreenTinker

Detailed setup is in the [GitHub README](https://github.com/screentinker/screentinker). Quick version:

```
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
```

Set `SELF_HOSTED=true` 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.

### Reverse proxy and TLS

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:

```
signage.example.com {
reverse_proxy localhost:3001
}
```

Caddy handles Let's Encrypt automatically. nginx works too if your team prefers it.

### Running as a service

Use systemd to keep the process alive across reboots. A unit file at `/etc/systemd/system/screentinker.service`:

```
[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
```

Enable with `systemctl enable --now screentinker`.

### Backups

The state lives in two places:

- `server/db/remote_display.db` - SQLite database of users, devices, playlists, schedules

- `server/uploads/` - uploaded media (images, videos, thumbnails)

A nightly tarball of those two paths gives you a full restore point. Pair with offsite sync (rclone, restic) for disaster recovery.

### Self-hosted vs cloud-hosted comparison

| Concern | ScreenTinker self-hosted | Cloud-only signage products |
| --- | --- | --- |
| Data location | Your server | Vendor's cloud |
| Recurring per-screen cost | None | $5-15/screen/month |
| Server cost | $5-50/month flat | None (included) |
| Internet required for management | No (LAN works) | Yes |
| Source code access | Yes (MIT) | Closed |
| Air-gapped deployment | Possible | Not possible |
| Vendor lock-in risk | None (you own it) | High |
| Update / patch responsibility | Yours | Vendor |
| Initial setup time | ~1 hour | ~5 minutes |

### When the cloud is the right answer

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.

### Related guides

- [Hosted digital signage: the cloud version](https://screentinker.com/cloud-digital-signage.html)

- [Digital signage on a Samsung TV (no app, no MagicINFO)](https://screentinker.com/guides/samsung-tv-digital-signage.html)

- [How to set up digital signage on a Raspberry Pi](https://screentinker.com/guides/raspberry-pi-digital-signage.html)

- [Free digital signage for Android TV and Fire TV](https://screentinker.com/guides/digital-signage-android-tv.html)

- [Compare: ScreenTinker vs Yodeck](https://screentinker.com/compare/yodeck-alternative.html)

- [Compare: ScreenTinker vs ScreenCloud](https://screentinker.com/compare/screencloud-alternative.html)

- [Compare: ScreenTinker vs OptiSigns](https://screentinker.com/compare/optisigns-alternative.html)

### Try the cloud version first

Use the hosted version to get familiar, then deploy on your own server when you are ready.

[Start Free](https://screentinker.com/app#/login)
[View on GitHub](https://github.com/screentinker/screentinker)
