Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
# Icon must end with two \r
Icon


# Thumbnails
._*

Expand All @@ -34,4 +33,6 @@ Temporary Items
# iCloud generated files
*.icloud

project_details/

# End of https://www.toptal.com/developers/gitignore/api/macos
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,8 @@ ScaleTail provides ready-to-run [Docker Compose](https://docs.docker.com/compose
| -------------- | ------------------------------------------------------------------------------------ | ---------------------------- |
| 🧭 **Glance** | A concise, customizable dashboard for self-hosted services and personal metrics. | [Details](services/glance) |
| 🏠 **Homepage** | A modern, highly customizable homepage for organizing links and monitoring services. | [Details](services/homepage) |
| 🖼️ **NewWallpaperWhoDis** | A lightweight, self-hosted wallpaper management server and dynamic rotation engine built on flat-file architecture. | [Details](services/newwallpaperwhodis) |


### 🛠️ Development Tools

Expand Down
17 changes: 17 additions & 0 deletions services/newwallpaperwhodis/.env
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
#version=1.1
#URL=https://github.com/tailscale-dev/ScaleTail
#COMPOSE_PROJECT_NAME= # Optional: only use when running multiple deployments on the same infrastructure.

# Service Configuration
SERVICE=newwallpaperwhodis # Service name (e.g., adguard). Used as hostname in Tailscale and for container naming (app-${SERVICE}).
IMAGE_URL=ghcr.io/upioneer/newwallpaperwhodis:latest # Docker image URL from container registry (e.g., adguard/adguard-home).

# Network Configuration
SERVICEPORT=6767 # Port to expose to local network. Uncomment the "ports:" section in compose.yaml to enable.
DNS_SERVER=9.9.9.9 # Preferred DNS server for Tailscale. Uncomment the "dns:" section in compose.yaml to enable.

# Tailscale Configuration
TS_AUTHKEY= # Auth key from https://tailscale.com/admin/authkeys. See: https://tailscale.com/kb/1085/auth-keys#generate-an-auth-key for instructions.

# Optional Service variables
# PUID=1000
29 changes: 29 additions & 0 deletions services/newwallpaperwhodis/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# NewWallpaperWhoDis with Tailscale Sidecar Configuration

This Docker Compose configuration sets up **NewWallpaperWhoDis** with a Tailscale sidecar container, enabling secure, private access to your self-hosted wallpaper manager over your Tailnet. With this setup, your NewWallpaperWhoDis instance is **not exposed to the public internet** and is only accessible from authorized devices connected via Tailscale.

## NewWallpaperWhoDis

[**NewWallpaperWhoDis**](https://github.com/upioneer/NewWallpaperWhoDis) is a lightweight, self-hosted wallpaper manager designed to turn browsers, tablets, smart TVs, Raspberry Pis, dashboards, and other display endpoints into dynamic smart displays. It uses a simple flat-file workflow, so wallpaper collections can be managed by placing images into directories instead of maintaining a traditional database-heavy media system.

The application scans your wallpaper files, processes useful metadata such as aspect ratio, orientation, and luminosity, and serves wallpapers through configurable rotation profiles. This makes it useful for dashboards, wall-mounted displays, digital signage-style setups, home labs, offices, and any environment where you want centrally managed wallpaper rotation without manually touching each display.

## Key Features

- 🖼️ Self-hosted wallpaper management for displays and browser-based endpoints
- 📁 Flat-file image library workflow with simple folder-based collection management
- 🔄 Dynamic wallpaper rotation through customizable profiles
- 🧭 Central web interface for managing wallpapers and endpoints
- 📺 Suitable for smart TVs, tablets, dashboards, Raspberry Pis, and kiosk-style screens
- 🧩 Lightweight deployment without a traditional relational database requirement
- 🔐 Tailnet-only access when paired with the included Tailscale sidecar

## Usage Notes

For display devices such as smart TVs, tablets, or dashboards, open the relevant NewWallpaperWhoDis player URL in a browser. Once the endpoint is connected, wallpaper behavior can be managed centrally from the web interface without needing to reconfigure the device directly.

## References

- [NewWallpaperWhoDis Website](https://newwallpaperwhodis.web.app/)
- [NewWallpaperWhoDis GitHub Repository](https://github.com/upioneer/NewWallpaperWhoDis)
- [Tailscale Docker Documentation](https://tailscale.com/kb/1282/docker)
71 changes: 71 additions & 0 deletions services/newwallpaperwhodis/compose.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
configs:
ts-serve:
content: |
{"TCP":{"443":{"HTTPS":true}},
"Web":{"$${TS_CERT_DOMAIN}:443":
{"Handlers":{"/":
{"Proxy":"http://127.0.0.1:3000"}}}},
"AllowFunnel":{"$${TS_CERT_DOMAIN}:443":false}}

services:
# Make sure you have updated/checked the .env file with the correct variables.
# All the ${ xx } need to be defined there.
# Tailscale Sidecar Configuration
tailscale:
image: tailscale/tailscale:latest # Image to be used
container_name: tailscale-${SERVICE} # Name for local container management
hostname: ${SERVICE} # Name used within your Tailscale environment
environment:
- TS_AUTHKEY=${TS_AUTHKEY}
- TS_STATE_DIR=/var/lib/tailscale
- TS_SERVE_CONFIG=/config/serve.json # Tailscale Serve configuration to expose the web interface on your local Tailnet - remove this line if not required
- TS_USERSPACE=false
- TS_ENABLE_HEALTH_CHECK=true # Enable healthcheck endpoint: "/healthz"
- TS_LOCAL_ADDR_PORT=127.0.0.1:41234 # The <addr>:<port> for the healthz endpoint
#- TS_ACCEPT_DNS=true # Uncomment when using MagicDNS
- TS_AUTH_ONCE=true
configs:
- source: ts-serve
target: /config/serve.json
volumes:
- ./config:/config # Config folder used to store Tailscale files - you may need to change the path
- ./ts/state:/var/lib/tailscale # Tailscale requirement - you may need to change the path
devices:
- /dev/net/tun:/dev/net/tun # Network configuration for Tailscale to work
cap_add:
- net_admin # Tailscale requirement
#ports:
# - "0.0.0.0:${SERVICEPORT:-6767}:3000" # Binding port to the local network - may be removed if only exposure to your Tailnet is required
# If any DNS issues arise, use your preferred DNS provider by uncommenting the config below
#dns:
# - ${DNS_SERVER}
healthcheck:
test: [ "CMD", "wget", "--spider", "-q", "http://127.0.0.1:41234/healthz" ] # Check Tailscale has a Tailnet IP and is operational
interval: 1m # How often to perform the check
timeout: 10s # Time to wait for the check to succeed
retries: 3 # Number of retries before marking as unhealthy
start_period: 10s # Time to wait before starting health checks
restart: always

# NewWallpaperWhoDis
application:
image: ghcr.io/upioneer/newwallpaperwhodis:latest
network_mode: service:tailscale # Sidecar configuration to route through Tailscale
container_name: app-${SERVICE}
environment:
- NODE_ENV=production
volumes:
# Map the data folder where the SQLite DB or structured metadata will live
- ./data:/app/data
# Map the wallpapers folder from host to the app so user can supply existing directories easily
- ./wallpapers:/app/wallpapers
depends_on:
tailscale:
condition: service_healthy
healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:3000/favicon.svg"]
interval: 1m
timeout: 10s
retries: 3
start_period: 30s
restart: always