Skip to content

Repository files navigation

🖼️ FramePilot

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.

Screenshot of the FramePilot window showing recipes and a seasonal calendar

License: MIT Python Platform Buy Me a Coffee


✨ What it does

  • 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.

🧩 What you need (required vs. optional)

🔴 Required — the core app needs these

  • 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.

🟢 Optional — nice to have

  • 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.


🚀 Quick start

  1. Download this project (green Code button → Download ZIP) and unzip it.
  2. Double-click install-mac.command. First time, macOS may block it — right-click the file → OpenOpen. This creates a private .venv and installs the dependencies (a few minutes the first time).
  3. Double-click start-mac.command. FramePilot appears in your menu bar (top-right). Click the icon to open the window.
  4. 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.


⚙️ How a recipe works

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.
  • OrderRandom or Sequential.
  • On refreshRolling (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.


📂 Where it keeps its data

  • Config + rotation history: ~/Library/Application Support/FramePilot/config.json
  • Logs: ~/Library/Application Support/FramePilot/framepilot.log

Nothing leaves your machine.


🔒 Security & privacy notes

  • 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 .gitignore keeps local logs and OS junk out of version control.

🖥️ Platform support

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.


🧪 Tests

python -m tests.test_engine

exercises the selection/refresh logic (unseen-first, repeats, replace/append, capping) with no GUI or Photos library required.


📄 License

Released under the MIT License — free to use, modify, and share. See LICENSE.


☕ Support

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! 🙌

About

Automate a photos folder on a schedule that you can then point other apps to for scheduled syncing

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages