Keep the moments. Clean the rest.

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.

Review today’s date across every year.

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

Every date you finish fills in your year

The Year calendar shows how much still waits on each date, and which ones you have already reviewed.

Your archive 0 of 366 dates reviewed
Fewer than 30 30 to 100 More than 100 Reviewed Today

How it works

  1. Bring your memories together

    Import camera files and exports from Apple Photos, iCloud or Google Photos.

  2. Let Daddy, Cull! organise them

    Files are grouped by the day they were taken, with related files kept together.

  3. Review a little each day

    Keep, favourite or remove each item, then mark the date reviewed. Years of photos become small daily sessions.

Setup details
  • Copy a camera card or phone export into the Import folder. New files are filed within a minute.
  • iCloud Photos downloads every six hours with icloudpd. Apple Photos on this Mac is copied with osxphotos. Google Takeout exports are checked against the library, so only what is missing is added.
  • Each file lands in YYYY/YYYY-MM/YYYY-MM-DD, dated from its metadata, then its name, then its file date.
  • Live Photos, RAW and JPEG pairs and sidecars stay together. Nothing is overwritten, and a file the library already holds is set aside for you to check.

Why it exists

Too much to look through

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.

Keep a copy you control

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.

Too many places to clean

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.

Read how it started

Your files stay yours

Plain folders, on your disk

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 overwritten

Nothing is deleted without passing through the Bin, and the Bin checks every file's SHA-256 fingerprint again before it moves it.

Removed files come back

Restore removed files before your chosen Bin retention period ends. ⌘Z takes back your last hundred choices.

Duplicates, proven

Only byte-identical copies are called duplicates, checked by full hash, and you choose which copy stays.

Apple Photos waits for you

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.

For the person at this Mac

It listens on 127.0.0.1 only, and only a private writer process changes the library. The web process only reads it.

Everything in it

Fast enough to enjoy, and careful with every file.

Duplicates, proven

Byte-identical copies across folders, verified by full hash. Pick the one to keep, and the rest go to the Bin.

A viewer like Google Photos

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.

Undo, a hundred deep

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

A Bin with a grace period

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.

New arrivals, flagged

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.

A streak worth keeping

Marking a date reviewed keeps your streak going, with a card and a little confetti. The flame opens a calendar of the run.

Google Photos, from Takeout

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.

Apple Photos in step

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.

Guides on every page

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.

Know what you hold

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.

Day and night

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 or a NAS

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.

Plays well with the rest

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.

Install the beta

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
Requirements on a Mac
macOS14 Sonoma or newer
ProcessorApple silicon or Intel
Memory4 GB
Free space2 GB, plus room for your library
AccountYour own user, not sudo
Needs nothing elseNo Docker, Homebrew or Python: the installer brings exiftool, ffmpeg and anything else missing

Everything is an API

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.

  • A Developers page inside Cull reads the reference, with a curl line for every route and a Send button for those that only read.
  • The whole API is described as OpenAPI 3.1 at /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.
  • Every failure is a status and a sentence you can show as it is.

Addons, including your own

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.

Build one in any language

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.

What's new

The latest betas:

  1. 0.78

    Library totals

    The sidebar counts photos and videos and the space each takes, as an addon that is on from the start.

  2. 0.76

    Jellyfin rescans

    Jellyfin is asked to scan again a minute after files move to the Bin, come back or are deleted.

  3. 0.75

    Servers and NAS boxes

    Run it with Docker Compose: a web container that only reads the library and a writer that files new arrivals.

  4. 0.74

    Immich from Settings

    Connect Immich with its address and an API key that is kept but never shown again.

  5. 0.72

    A one-line Mac installer

    It checks the Mac, brings what is missing, and adds a daddy-cull command to start, update and uninstall.

  6. 0.70

    A setup wizard

    Folders, iCloud, Apple Photos and Google Photos, one step at a time in the browser.

  7. 0.67

    The Import folder

    New files are filed by the day they were taken within a minute, and iCloud downloads are filed the same way.

  8. 0.66

    Google Photos

    Add what a Takeout export holds and the library lacks.

  9. 0.64

    Addons and Developers pages

    Turn features on and off, and read the API reference with a curl line for every route.

  10. 0.62

    Background tasks

    Emptying and restoring the Bin run in the background as tasks that can be stopped or tried again.

Every release on GitHub