What It Does
Point Save Cannes at your own films — a single file, a folder of them, a whole library of folders, or a live stream — and when the Mac goes quiet it covers every display and starts playing. Move the mouse or press a key and it goes.
It is a tribute to Save Hollywood by WhiteBox, the much-loved saver that did exactly this until macOS broke it. Same idea, rebuilt from scratch on the modern Jorvik screensaver pattern.
Sources
Add as many as you like, of three kinds, mixed freely. Each has a switch, so a source can be set aside without being forgotten — it stays in the list, dimmed, with its count still showing so you know what you are switching back on.
| Kind | Behaviour |
|---|---|
| Folder | Walked recursively, so a library organised one-folder-per-film needs no flattening. Hidden files are skipped and bundles aren’t opened up. |
| File | A single video, played on loop when it is the only source. |
| Stream | A URL handed straight to the player — an HLS .m3u8 or a direct MP4, over http or https only. |
A stream has to be something the player can open by itself, not a web page it would have to scrape — which rules out YouTube and the like by design rather than by omission.
The chevrons at the left of each row move a source up or down, which is how you say “this folder first” in sequential order. The magnifying glass shows a source in Finder — worth a click before you walk away, to be sure the saver is pointed where you think it is.
Nothing is ever moved or altered on disk. Save Cannes only ever reads.
Streams Known to Work
| Stream | Notes |
|---|---|
| NASA+ | Live, 24/7, Earth and space footage. The best fit for a screensaver. |
| DW English | Live, 24/7 news. |
| Apple’s sample stream | On-demand, so it ends — useful for testing hand-over to the next source. |
The exact addresses are in the README, along with how to ask NASA for a current one when theirs rotates.
A live stream never hands over. It has no end, so once a display lands on one it stays there until you dismiss the saver — a playlist can’t advance past something that never finishes. That is inherent rather than a fault, but it does mean a live stream mixed into a folder of films will eventually take that display for the rest of the session.
Photographs
Photographs play too, alongside the videos in the same folder — JPEG, PNG, HEIC, TIFF, camera RAW, anything macOS knows as an image. Each is held for a few seconds before the next one. Turn them off if your film folders have cover art or downloaded posters in them that you would rather not see.
A folder of photographs plays through as a collection: once the first comes up the rest follow, and only then does the next film play.
Playback
| Order | Description |
|---|---|
| Random | Shuffled across everything from every switched-on source, and reshuffled each time it works through them, so you don’t get the same running order twice. |
| Sequential | Each source in turn, in the order listed, and each source’s files in path order — so a folder’s contents stay together rather than interleaving with another library. |
| Size on screen | Description |
|---|---|
| Full screen, cropped to fit | Fills the display; whatever overflows the long edge is cropped away. The default. |
| Fit to screen, no cropping | The whole frame is visible, letterboxed or pillarboxed on black. |
| Original size | One video pixel to one screen pixel, centred on black. Anything larger than the display is scaled down to fit. |
Multiple displays each get their own window and their own playback. Sequential order always plays the same video everywhere, in step — starting each display at a different file would make the ordering meaningless, so the per-display toggle is switched off and greyed out. Random order lets you choose: a three-monitor desk can play three different films at once, or all three can share one shuffle.
Sound is off by default — a screensaver that starts talking to an empty room is nobody’s friend. With more than one display it plays on the main display only, since each display runs its own playback and the alternative is the same soundtrack two or three times over, a few frames apart.
Titles
A caption low in the corner tells you what is playing: fades in, holds a few seconds, fades out. Never, as each video starts, or repeatedly every 1–60 minutes for a screen people wander past rather than sit in front of.
The text is the file’s own embedded title when it carries one, and its filename without the extension when it doesn’t. Never the full path — nobody wants their folder structure projected on a wall. Captions are drawn with a soft shadow, because a video screensaver can’t know what it is drawing over and white-on-white is otherwise a real possibility on the wrong shot.
Screenshots
Set a hotkey under Settings → Capture and press it while the saver is playing. The frame is written to ~/Pictures/Save Cannes/ as a PNG.
The frame is pulled from the video file rather than grabbed off the screen, so you get the whole frame at the video’s own resolution — a shot taken in full-screen mode isn’t cropped to the shape of whichever display it happened to be on. That also means a live stream can’t be captured: there is no file to seek into.
Configuration
Click the film-strip menu bar icon and choose Settings…. Everything persists immediately — there is no Save button and nothing to restart.
- Permissions — accessibility status, needed only if you turn on lock-on-dismiss. The row follows the switch in System Settings as you flip it
- Sources — the folders, files and streams to play, each with an include switch, a count of what was found, and a button to reveal it in Finder
- Playback — order, and sound
- Display — how each video is fitted to the screen, and whether every display shows the same
- Photos — whether photographs play, and how long each is held
- Titles — whether the title appears on screen, and how often
- Activation — idle timeout in minutes, and a global “Play now” hotkey
- On dismiss — lock the screen automatically when the saver dismisses
- Capture — a global hotkey that saves the current frame as a PNG
- General — Launch at Login
Auto-Update
Save Cannes uses Sparkle 2.x for auto-update, checked daily. Updates are EdDSA-signed, so your copy will only ever install genuine Jorvik Software releases. There is a Check for Updates… item in the menu if you would rather ask yourself.
Privacy
This app reads your films and looks at your photographs, so it is worth being precise about what it does with them.
- Nothing is copied, indexed, or uploaded. Your videos are read from the folder you chose and played locally. Save Cannes only ever reads.
- Photographs are examined on your Mac to decide how to present them, using on-device Vision and Core ML. No photograph, and nothing derived from one, leaves the machine.
- No camera, microphone, or screen recording. It asks for none of them.
- No telemetry, and no network traffic beyond Sparkle’s appcast fetch — plus whatever a stream you added fetches, which is the whole point of it.
- No log file at all unless you explicitly turn one on with
defaults write cc.jorviksoftware.SaveCannes debugLogging -bool YES. - Permissions: if the folder you choose lives in Desktop, Documents or Downloads, macOS asks the first time. Save Cannes triggers that prompt as you add the folder — while you are looking at Settings — rather than later from behind a fullscreen saver where you couldn’t see it.
Installation
Two formats on every release — both signed and notarised, pick whichever suits:
- Installer (
.pkg) — recommended for first-time installs. Double-click to run; macOS Installer placesSave Cannes.appin/Applicationswithout quarantine or App Translocation. - Download (
.zip) — unzip and dragSave Cannes.appto your Applications folder.
Or install it with Homebrew: brew install --cask perpetualbeta/jorvik/savecannes
A small film-strip icon appears in the menu bar — that is your only touchpoint. Open Settings… and add a source before anything will play.
Unlike its siblings, Save Cannes does register itself for launch at login on first run, because a screensaver that isn’t running isn’t a screensaver. Turn that off in Settings → General if you would rather start it yourself.
Why an App, Not a .saver
Save Cannes is a screensaver-style product that ships as an ordinary app. The deciding reason is file access. A .saver runs inside Apple’s legacyScreenSaver host process, which owns the permission identity — a hosted saver can never hold a file-access grant of its own, so it could never reliably read the folder you chose.
Save Hollywood hit this wall first, and its author’s own account is worth reading, because it is the same wall: “In macOS Catalina, Apple completely broke the standard open panel APIs when invoked from a screen saver.” Choosing a file is the entire interface for a saver like this, and from inside the host process there was no longer a supported way to offer it.
Save Cannes puts the picker, and the file access it grants, in an ordinary app where both still work — and gets the configurator, hotkeys and lock-screen integration a saver bundle can’t reach. This is the default shape for Jorvik screensavers, established by Rainy Day and followed by ASCII Saver.
How It Works
A background app with no Dock icon polls system idle time and, past your threshold, opens a fullscreen window at screensaver level on every display.
- Playback —
AVPlayerinto anAVPlayerLayer, one per display, walking a playlist read fresh on every activation. A stream is the same player item with a remote URL, which is why streams cost almost no extra code — skip-on-failure, the watchdog and the ordering all treat them like anything else - Bad files are skipped silently. Anything that isn’t a video is filtered by type before playback; anything that is but can’t be decoded is skipped as it comes up
- Nothing gets stuck. A watchdog moves on from a video that plays but never reports finishing, rather than leaving a frozen frame up all night — on unhurried thresholds, because cutting a good film short would be the worse fault
Uninstalling
Quit Save Cannes from its menu bar icon and drag Save Cannes.app to the Trash. If you installed it with Homebrew, brew uninstall --cask perpetualbeta/jorvik/savecannes instead.
Building from Source
Save Cannes is free and open source, and builds via the shared Jorvik release.mk. With the jorvik-release sibling repo cloned alongside it and GNU Make 4 installed:
- Clone the repo:
git clone https://github.com/PerpetualBeta/SaveCannes.git - Local build, signed with the Jorvik Developer ID:
gmake dev-build - Run the freshly-built copy:
gmake run - Signed, notarised, stapled
.zip+.pkgready to ship:gmake release
Requirements
macOS 14 (Sonoma) or later. Universal binary — Apple Silicon and Intel.