A Mac menu-bar app that automatically keeps a folder full of rotating photos — purpose-built for feeding Nixplay frames through a Dropbox-synced folder, but it works with anything that displays photos from a folder.
Digital photo frames are great until you realize you have to keep feeding them new pictures by hand. FramePilot does it for you. You define recipes: each one pulls a set number of photos from sources you choose (Apple Photos albums and/or folders on disk) into a target folder, on whatever schedule you set. It always shows photos you haven't seen yet before repeating any, and keeps the target folder capped at a size you pick. Point Nixplay/Dropbox at that folder and it rotates itself — set it and forget it.
- Automatic photo rotation. Define a recipe, and FramePilot drips fresh photos into your frame's folder on a schedule — every few minutes, hours, days, or on set weekdays and times. No more manually copying pictures.
- Unseen-first selection. It remembers every photo it has placed and always prefers pictures you haven't shown yet. Only once a source pool is exhausted does it repeat, and even then it picks the least-shown first — so your frame keeps feeling fresh.
- Mix any sources. Pull from Apple Photos albums, folders on disk, or both in the same recipe.
- Two rotation styles. Rolling keeps the folder at a steady size, adding new photos and dropping the oldest only once it hits your max. Replace swaps in a fresh set each cycle — copying the new photos in before removing the old ones, so the frame never flashes blank and Dropbox doesn't re-sync an emptied folder.
- Seasonal calendars. Layer date-ranged "seasons" on top — beach photos all summer, holiday photos Dec 20–Jan 5 — that automatically take over a folder while active and hand it back afterward. Repeat them every year and forget about it.
- HEIC → JPEG conversion. Optionally convert HEIC/PNG images to JPEG on the way into the folder, for frames that don't render HEIC.
- Runs quietly in the background. Lives in your menu bar, refreshes on a background thread so the UI never freezes, and can start automatically at login.
- macOS and Python 3.10+ (download).
- A folder your frame reads from. For a Nixplay frame that's typically a folder inside Dropbox that you've connected to Nixplay's cloud. Any photo-frame or slideshow that displays a folder works too.
- At least one photo source — an Apple Photos album, a folder of images on disk, or both.
- Apple Photos. If you want to pull from Photos albums, macOS will ask permission the first time (click OK). Prefer not to? Just use folder sources — everything else works the same.
- Dropbox (or any cloud sync your frame uses). FramePilot only manages a local folder; Dropbox is what carries changes up to a Nixplay frame. Without it, FramePilot still rotates a local folder for any slideshow that reads one directly.
Everything runs locally on your own Mac. FramePilot has no accounts, no cloud service of its own, and no API keys — it just organizes photos into a folder.
- Download this project (green Code button → Download ZIP) and unzip it.
- Double-click
install-mac.command. First time, macOS may block it — right-click the file → Open → Open. This creates a private.venvand installs the dependencies (a few minutes the first time). - Double-click
start-mac.command. FramePilot appears in your menu bar (top-right). Click the icon to open the window. - Click New, pick your sources and target folder, set a schedule, and you're rotating.
Full step-by-step instructions (and Windows/Linux notes) are in INSTALL.md.
Click New and fill in:
- Target folder — the folder your frame reads (e.g. your Dropbox → Nixplay folder).
- Sources — check Apple Photos albums and/or disk sub-folders to draw from.
- Photos to add each refresh — how many new photos to drop in each cycle.
- Order — Random or Sequential.
- On refresh — Rolling (keep newest up to a max) or Replace (fresh set each time).
- Max photos in folder — the ceiling this recipe keeps in the target.
- Don't repeat within N days — avoids reshowing a photo within that window (
0= off). - Convert HEIC/PNG to JPEG — for frames that don't render HEIC.
- Schedule — every N minutes/hours/days, weekly (weekdays + times), or manual only.
Run several recipes at once, each on its own schedule. Files FramePilot copies are prefixed fp_<recipeid>_ so it only ever manages its own photos and never touches anything else in the folder. Full details on recipes and seasonal calendars are in the docs.
- Config + rotation history:
~/Library/Application Support/FramePilot/config.json - Logs:
~/Library/Application Support/FramePilot/framepilot.log
Nothing leaves your machine.
- FramePilot runs entirely locally. It has no login, no server, no cloud — it just reads photos and writes them into a folder you choose.
- It only manages files it created (tagged
fp_<id>_), so it won't delete or overwrite your other photos in the target folder. - Apple Photos access is opt-in and granted by macOS the first time you add a Photos source. You can revoke it anytime in System Settings → Privacy & Security → Photos.
- The included
.gitignorekeeps local logs and OS junk out of version control.
FramePilot is built and tested on macOS. Apple Photos sources and "Start at login" rely on macOS-only APIs (osxphotos and LaunchAgents). Windows/Linux are experimental and unsupported: folder sources may work since the GUI (PySide6) is cross-platform, but Apple Photos and login-autostart won't. See INSTALL.md if you want to try.
python -m tests.test_engine
exercises the selection/refresh logic (unseen-first, repeats, replace/append, capping) with no GUI or Photos library required.
Released under the MIT License — free to use, modify, and share. See LICENSE.
I build and share these tools for free in my spare time. If FramePilot keeps your frames fresh without any fuss, you can buy me a coffee — genuinely appreciated, and it helps me keep making things like this. Enjoy! 🙌
