GitHub - hauxir/macos-live-screensaver: Use live streams as screensavers/lock screens on MacOS

2 min read Original article ↗

MacOS Live Screensaver

A macOS screensaver that plays live video streams. Supports YouTube videos and direct HLS streams.

Also available: Android TV Live Screensaver

Why?

Turn any live stream into your screensaver/lockscreen. Some examples:

Namib Desert Wildlife

Image

Times Square

Image

The News

Image

Requirements

  • macOS
  • Swift compiler (Xcode Command Line Tools)
  • yt-dlp (optional, for YouTube support)
  • ffmpeg (optional, required alongside yt-dlp for YouTube support)

Disclaimer: This project was entirely vibe-coded. I've never written Swift before in my life.

Note: This was tested exclusively on macOS Tahoe on an M2 MacBook. Your mileage may vary on other versions/hardware.

Installation

Install yt-dlp and ffmpeg (for YouTube support)

Using Homebrew:

brew install yt-dlp ffmpeg

Or install yt-dlp using pip:

pip install yt-dlp
brew install ffmpeg

Build and Install

Build and install:

Or step by step:

make build
open build/LiveScreensaver.saver

Other commands:

make clean      # Remove build directory
make uninstall  # Remove screensaver from ~/Library/Screen Savers/
make start      # Trigger screensaver immediately

Usage

  1. Open System PreferencesScreen Saver
  2. Select Live Screensaver
  3. Click Options to configure
  4. Enter a video URL:
    • YouTube: https://www.youtube.com/watch?v=VIDEO_ID (live streams only)
    • HLS stream: https://example.com/stream.m3u8

Note: Only live YouTube videos are supported. Regular (non-live) YouTube videos will not work.

Image

Note: macOS screensaver UI can be buggy. If the Options button is unresponsive, try closing and reopening System Settings. PRs welcome for anyone who can figure out why.

Troubleshooting

YouTube videos don't play:

  • Make sure yt-dlp and ffmpeg are installed and in your PATH
  • Verify you're using a live YouTube stream - regular videos are not supported

Black screen: Wait a few seconds for loading, or try a different URL