Duplicates, proven
Byte-identical copies across folders, verified by full hash. Pick the one to keep, and the rest go to the Bin.
Daddy, Cull! is a free photo and video organiser for people with years of memories and an overwhelming backlog. It brings your files into one library on your own disk. Each day, review the photos and videos taken on this date across every year, keep the moments you love, and send unwanted files to the Bin.
Culling simply means choosing what to keep and what to remove.
Free and open source. Runs locally on macOS 14 or newer, with a browser interface. Also available for servers with Docker.
On 30 September, review your photos and videos from 30 September in 2016, 2019, 2023 and every other year in your library.
K keeps X removes F favourites ⌘Z undoes ⇧R marks the date reviewed
The Year calendar shows how much still waits on each date, and which ones you have already reviewed.
Import camera files and exports from Apple Photos, iCloud or Google Photos.
Files are grouped by the day they were taken, with related files kept together.
Keep, favourite or remove each item, then mark the date reviewed. Years of photos become small daily sessions.
YYYY/YYYY-MM/YYYY-MM-DD, dated from its metadata, then its name, then its file date.Bursts, near-identical shots, screenshots and copies pile up around the moments that matter. Clouds charge every year to store all of it, unsorted, and the backlog only grows.
Clouds are brilliant at keeping every device in step, but get locked out of the account and the photos go with it. Daddy, Cull! keeps your library as plain folders on a disk you own, ready to back up to a second drive, a NAS or a cloud of your choice.
Photos end up in iCloud, Google Photos and Lightroom at once. Clean one and the others are still full, so the effort never adds up.
Local, and in a layout any app can read. Back the folder up like any other, so a second copy lives somewhere else too.
Nothing is deleted without passing through the Bin, and the Bin checks every file's SHA-256 fingerprint again before it moves it.
Restore removed files before your chosen Bin retention period ends. ⌘Z takes back your last hundred choices.
Only byte-identical copies are called duplicates, checked by full hash, and you choose which copy stays.
With Cull Sync on, a photo you remove can also be removed from Apple Photos and iCloud. Nothing changes until you press Apply, macOS asks you to confirm, and removals go to Recently Deleted.
It listens on 127.0.0.1 only, and only a private writer process changes the library. The web process only reads it.
Fast enough to enjoy, and careful with every file.
Byte-identical copies across folders, verified by full hash. Pick the one to keep, and the rest go to the Bin.
Step through with the arrow keys, turn with ] and [, open Info for the camera and fingerprints. A RAW and its JPEG are one photo, and HDR video is tone mapped.
⌘Z takes back each choice in turn and ⌘U does it again. The Log lists every decision, and a removed file can be restored until its Bin retention period ends.
Removed files wait in the Bin for the days you choose. Emptying and restoring run in the background as tasks you can stop or try again file by file, and they carry on after a restart.
An open page shows files the moment they reach the library. A reviewed date that gains new files comes back with a red dot until they are decided.
Marking a date reviewed keeps your streak going, with a card and a little confetti. The flame opens a calendar of the run.
Drop Takeout exports into a folder. Each photo is checked against the library and sorted, so you add only what is missing, never over anything and never twice.
Cull Sync, a small menu-bar helper, carries what you removed and favourited across to the Photos app. A photo removed there also leaves iCloud, so nothing changes until you press Apply, and removals go to Recently Deleted.
Each page opens with a short guide to how it works, keys drawn as keys. ? lists every shortcut, and every action shows its key in its tooltip.
The sidebar counts the photos and videos in the library and the space each takes, and the Year calendar shows how much still waits on every date.
The theme follows your clock, not a setting: light by day, dark by night, so an evening session never glares. Chrome can install it as an app.
On a Mac it runs as two background services. On a server, Docker Compose runs a web container that can only read the library and a writer that files new arrivals.
The library is plain folders, so Immich, Jellyfin, Plex or Finder can all read it as an external library. Favourites you set in Daddy Cull are set in Immich too, and Jellyfin is asked to scan again a minute after files leave the library, so it stops showing videos that are gone.
Every green build is released as a beta. Paste this into Terminal. It checks this Mac first and changes nothing if a requirement is missing, then opens the setup wizard.
curl -fsSL https://raw.githubusercontent.com/tural-ali/daddy-cull/main/install.sh | bash
On Linux, Unraid, Synology or TrueNAS, run it with Docker Compose. Fill in examples/.env with the folders, the user that owns them and a private key, then build and start both containers.
git clone https://github.com/tural-ali/daddy-cull.git cd daddy-cull cp examples/.env.example examples/.env VERSION=$(tools/version.sh) docker compose -f examples/docker-compose.yml up -d --build
The server guide covers the layout, Google Photos, Immich, Jellyfin, updates and keeping it off the open internet.
| macOS | 14 Sonoma or newer |
|---|---|
| Processor | Apple silicon or Intel |
| Memory | 4 GB |
| Free space | 2 GB, plus room for your library |
| Account | Your own user, not sudo |
| Needs nothing else | No Docker, Homebrew or Python: the installer brings exiftool, ffmpeg and anything else missing |
The pages you click through use the same API an addon or a script can. It is versioned and fully documented: 86 routes in 22 groups, each with its parameters, errors and the permission it needs.
curl line for every route and a Send button for those that only read./api/openapi.json, for any tool that reads it.GET /api/events streams what happens as server-sent events, and picks up where it left off after a break.Everything beyond reviewing dates, duplicates and the Bin is an addon you can turn off in one place, with its pages, routes and background work stopping with it.
An addon is a folder with an addon.json. It shows on the Addons page a moment after you drop it in, says what it may do before its key is written, and adds its own pages to the sidebar in a sandboxed frame that is told the theme.
{ "id": "hello-cull", "name": "Hello, Cull", "version": "0.1.0", "summary": "Shows what the library holds.", "pages": [{ "id": "hello", "label": "Hello", "section": "tools", "url": "http://127.0.0.1:8900/" }], "permissions": [] }
Every addon may read. Anything more, review, import, bin, delete or settings, is asked for, shown before it is turned on, and checked on every request.
Built in: Screenshots, Saved from social, Google Photos, Apple Photos, Immich, Jellyfin, Library totals and more.
The latest betas:
The sidebar counts photos and videos and the space each takes, as an addon that is on from the start.
Jellyfin is asked to scan again a minute after files move to the Bin, come back or are deleted.
Run it with Docker Compose: a web container that only reads the library and a writer that files new arrivals.
Connect Immich with its address and an API key that is kept but never shown again.
It checks the Mac, brings what is missing, and adds a daddy-cull command to start, update and uninstall.
Folders, iCloud, Apple Photos and Google Photos, one step at a time in the browser.
New files are filed by the day they were taken within a minute, and iCloud downloads are filed the same way.
Add what a Takeout export holds and the library lacks.
Turn features on and off, and read the API reference with a curl line for every route.
Emptying and restoring the Bin run in the background as tasks that can be stopped or tried again.