diff --git a/.gitignore b/.gitignore index 314044f..8b4c039 100644 --- a/.gitignore +++ b/.gitignore @@ -10,7 +10,6 @@ # Icon must end with two \r Icon - # Thumbnails ._* @@ -34,4 +33,6 @@ Temporary Items # iCloud generated files *.icloud +project_details/ + # End of https://www.toptal.com/developers/gitignore/api/macos \ No newline at end of file diff --git a/README.md b/README.md index 1e2ba83..73a7eb8 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/services/newwallpaperwhodis/.env b/services/newwallpaperwhodis/.env new file mode 100644 index 0000000..c943f0c --- /dev/null +++ b/services/newwallpaperwhodis/.env @@ -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 diff --git a/services/newwallpaperwhodis/README.md b/services/newwallpaperwhodis/README.md new file mode 100644 index 0000000..51fe0bd --- /dev/null +++ b/services/newwallpaperwhodis/README.md @@ -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) diff --git a/services/newwallpaperwhodis/compose.yaml b/services/newwallpaperwhodis/compose.yaml new file mode 100644 index 0000000..543caa4 --- /dev/null +++ b/services/newwallpaperwhodis/compose.yaml @@ -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 : 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