{"id":50241048,"url":"https://github.com/ut42tech/synchronized-screensaver","last_synced_at":"2026-05-26T21:04:13.779Z","repository":{"id":340071116,"uuid":"1164362929","full_name":"ut42tech/synchronized-screensaver","owner":"ut42tech","description":"Web Based Screensaver, Svelte ","archived":false,"fork":false,"pushed_at":"2026-02-23T04:58:35.000Z","size":4066,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-02-23T11:47:17.814Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ut42tech.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-02-23T01:50:09.000Z","updated_at":"2026-02-23T04:58:38.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/ut42tech/synchronized-screensaver","commit_stats":null,"previous_names":["ut42tech/synchronized-screensaver"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/ut42tech/synchronized-screensaver","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ut42tech%2Fsynchronized-screensaver","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ut42tech%2Fsynchronized-screensaver/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ut42tech%2Fsynchronized-screensaver/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ut42tech%2Fsynchronized-screensaver/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ut42tech","download_url":"https://codeload.github.com/ut42tech/synchronized-screensaver/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ut42tech%2Fsynchronized-screensaver/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33538679,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"ssl_error","status_checked_at":"2026-05-26T15:22:15.568Z","response_time":63,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-05-26T21:04:03.020Z","updated_at":"2026-05-26T21:04:13.771Z","avatar_url":"https://github.com/ut42tech.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🖥️ Synchronized Screensaver\n\n**[🇯🇵 日本語版 README](docs/README.ja.md)**\n\n\u003e Time-synced full-screen video playback across multiple devices — no server communication required.\n\nMultiple Macs (or any device with a web browser) play the **same video at exactly the same position** by calculating the playback offset from the current UTC time. Designed to run as a macOS screensaver via [WebViewScreenSaver](https://github.com/nickthedude/WebViewScreenSaver).\n\n## ✨ How It Works\n\n```\ntargetTime = (Date.now() / 1000) % video.duration\n```\n\nEvery device independently computes where in the video loop it should be, based on the system clock. No WebSocket, no signaling server — just synchronized clocks.\n\n**Drift correction** — every 10 seconds, drift is checked and corrected via seek when it exceeds 100ms. No `playbackRate` manipulation for maximum cross-browser compatibility.\n\nClients opened late **wait on a black screen** until initial sync is confirmed, then fade in.\n\n## 🚀 Quick Start\n\n```bash\n# Clone \u0026 install\ngit clone https://github.com/ut42tech/synchronized-screensaver.git\ncd synchronized-screensaver\npnpm install\n\n# Start dev server\npnpm run dev\n```\n\nOpen `http://localhost:5173` in multiple tabs — playback is already synchronized.\n\n## ☁️ Deploy to Cloud\n\nDeploy your own instance with one click:\n\n[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/ut42tech/synchronized-screensaver)\n[![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/ut42tech/synchronized-screensaver)\n\n## 🏠 LAN Deployment (Docker)\n\nFor lab/office environments where all devices are on the same network:\n\n```bash\n# Build the app\npnpm run build\n\n# Start Nginx container\ndocker compose up -d\n```\n\nAll clients on the LAN can access `http://\u003cserver-ip\u003e/` and will play in perfect sync.\n\n### Updating the Video\n\nSimply add or replace `.mp4` files in `public/videos/` and restart:\n\n```bash\ncp /path/to/new-promo.mp4 public/videos/\ndocker compose restart\n```\n\nThe app automatically discovers all `.mp4` files in the videos directory — no code changes required.\n\n## 🍎 macOS Screensaver Setup\n\n1. Install [WebViewScreenSaver](https://github.com/nickthedude/WebViewScreenSaver)\n2. Open **System Settings → Screen Saver**\n3. Select **WebViewScreenSaver**\n4. Set the URL to your deployment (e.g. `http://192.168.1.100/`)\n5. Adjust idle timeout and display sleep settings as needed\n\n## 🎬 Using Your Own Video\n\n1. Place your `.mp4` file(s) in `public/videos/`\n2. Rebuild if using Docker: `pnpm run build \u0026\u0026 docker compose up -d --build`\n\nThe app automatically discovers the first `.mp4` file (alphabetically) in the directory.\n\n\u003e [!TIP]\n\u003e Large production videos are excluded from Git by default (`.gitignore`).\n\n## 🛠️ Tech Stack\n\n| Layer         | Technology                          |\n| ------------- | ----------------------------------- |\n| Frontend      | Vite + Svelte 5 (TypeScript)        |\n| LAN Hosting   | Docker Compose + Nginx              |\n| Cloud Hosting | Vercel / Netlify / Cloudflare Pages |\n| Client        | macOS + WebViewScreenSaver          |\n\n## 📄 License\n\n[MIT](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fut42tech%2Fsynchronized-screensaver","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fut42tech%2Fsynchronized-screensaver","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fut42tech%2Fsynchronized-screensaver/lists"}