Photo workflow automation for Mac, from card to client gallery.
Every shoot ends the same way: card in, twenty minutes of identical clicking, a folder full of files named DSC_4471.NEF that will mean nothing in six months. Watchflows chains your offload, rename, backup, and delivery steps into one flow that runs itself, on a visual canvas, on your Mac.
14-day free trial · no credit card · $49 one-time · macOS
Sound familiar?
The ritual, every single time. Plug in the card, copy everything to a folder, rename it by hand, split RAW from JPEG, copy again to the backup drive. Twenty minutes of clicking that is identical after every shoot, forever.
Filenames that tell you nothing. Six months from now a client asks for "the one by the window at the reception," and DSC_4471.NEF is not going to help either of you find it.
A backup you only think ran. Nobody notices a failed rsync until the card is already reformatted and the shoot exists in exactly one place, which is the worst possible time to find out.
Delivery busywork. Resize, watermark, zip, upload, email the link, log who got what and when. Every single gallery, by hand, again.
Five workflow recipes for the pipeline you already run
Every recipe below is real nodes on a real canvas — not a mockup. Build it once in Watchflows and it runs on its own after that. The first one is nothing but built-in nodes — zero scripting. A few further down reach for a Script node to run a tool you already trust, like rsync or ImageMagick; that's there when you want it, not a prerequisite for any of this.
Every photo named and filed, no scripting
A new photo gets a real name and lands in a dated folder — zero command line.
Photo Added fires the moment an image lands in your Photos library — an iPhone shot syncing over iCloud, a screenshot, an import, whatever route it came in. Image Metadata reads the EXIF straight off it: capture date, camera body, lens. A Template node composes the new filename and destination folder from those values — {{exif.dateTakenCompact}}, {{exif.cameraModel}} — and Rename File and Move File carry it out. Photo Added's own copy is temporary, so Move File is also what makes the result permanent. Five built-in nodes, no terminal, nothing to install.
Card in, shoot filed
Insert the card. Come back to a dated, renamed, sorted folder.
A System Event trigger set to Volume Mount fires the moment the card mounts, handing downstream nodes the volumeName and volumePath it came up at. A Run Script node calls rsync against {{volumePath}} to offload the card and hands back its exit code — so the flow works no matter which reader or slot you used. For Each walks the copied files one at a time; Image Metadata reads the EXIF straight off each RAW or JPEG — capture date, camera body, lens — and a Template node builds the destination path from those values, {{exif.dateTakenCompact}}, {{exif.cameraModel}}. Move File puts each frame where it belongs, and this is how automatically organizing photos on Mac stops being a chore you remember to do.
RAW and JPEG go their separate ways
One folder in, two clean folders out.
Directory Changed watches your import folder recursively and fires on every new file. A Condition node checks the file extension — one matches_regex rule catches nef, cr2, cr3, arw, dng, whatever your body shoots — and routes RAW down one outlet, JPEG down the other, each into its own Move File. Four nodes total, and the execution timeline shows exactly which branch every file took, so sorting RAW and JPEG automatically on Mac stops being a guess about what the last run actually did.
Client gallery, zipped and sent
Drop finals in a folder; delivery happens.
Point File Changed at the last file you export for a set — your final JPEG, or a manifest.txt you touch when the edit pass is done — and it kicks off the chain. Run Script calls ImageMagick to resize and batch-watermark the set on your Mac, Zip bundles it into one archive, API Request uploads it to whatever host you deliver through, and an Apple Notes action logs what went out, to whom, and when — so "did I already send that gallery" stops being a question you ask yourself at 11pm.
A backup that tells you when it fails
Nightly mirror to the NAS, with a notification when it does not work.
Schedule fires nightly on a calendar rule. Run Script runs rsync and hands its exit code downstream as a real payload value — no parsing log output for the word "error." A Condition node checks that exit code, and only the failure path reaches a Notification. This is photo backup automation on Mac that stays out of your way: silence means it worked.
Why not just use Hazel, Photo Mechanic, or Lightroom?
Hazel
Search "Hazel for photographers" and you'll find a decade of forum threads wiring Hazel rules to ExifTool scripts to get date-based renaming — because Hazel itself doesn't do it. It's a rules engine, not a pipeline: a rule matches a file and runs one action. Chaining a script into an AI call into a conditional notification means bridging Hazel to launchd or Automator underneath it, invisibly, with no timeline showing you what actually happened to which file.
Photo Mechanic
The fastest ingest tool that exists, full stop — nothing culls and captions a card faster. But ingest is where it stops. It won't sort RAW from JPEG into separate trees, watermark a delivery set, or notify you when a backup fails. It's a specialist priced like one, and it covers a single stage of a five-stage pipeline. Plenty of photographers run both: cull in Photo Mechanic, let Watchflows handle everything before and after.
Lightroom
Lightroom's import can rename files and apply a preset on the way in, but it stops at the catalog edge — it won't run a script, call a webhook, or watermark and zip a delivery folder. And you're renting it every month whether you shoot or not.
Image Capture + Automator + Folder Actions
Free, and technically capable of a lot with enough AppleScript. Also the first thing that silently stops working after a macOS update, with no log and no notification — you find out it broke when a client asks where their gallery is.
Single-purpose AI renamers
A few small apps will rename and keyword-tag photos with AI now. They do that one job, well, for a monthly fee, and stop exactly at the file boundary — no backup step, no delivery step, and no way to add a second job without buying a second subscription.
What we're not trying to be
Lightroom and Capture One remain untouchable for culling and developing — that's a different, harder problem, and we're not solving it. Photo Mechanic ingests faster than anything we'd build. Watchflows isn't your editor. It's the glue around it: the filing, the backup, and the delivery your editor was never going to do for you.
Your shoots never leave your Mac
Watchflows runs on your Mac, not in someone else's data center. Files move between folders you own; nothing in the app requires an account, and there's no cloud sync of your flows or your images. API keys for any AI provider you connect live in the macOS Keychain, not in a browser session somewhere.
An optional Watchflows Cloud subscription adds hosted AI credits and a public webhook relay, for people who want either without running their own provider. The app is complete without it — every recipe on this page runs on the $49 one-time purchase alone.
Questions photographers ask
Does Watchflows replace Lightroom or Capture One?
No. Culling and developing are a different, harder problem, and Lightroom and Capture One are built for exactly that. Watchflows handles what happens before and after: offload, rename, sort, backup, and delivery. Most photographers run both — Watchflows files the shoot, then you open the catalog to edit.
Can it rename RAW files by EXIF date, not just JPEGs?
Yes. The Image Metadata node reads through macOS's ImageIO framework, the same engine behind Preview and Quick Look, so if your Mac can preview a RAW format — NEF, CR2, CR3, ARW, DNG, and most others — Watchflows can pull its capture date, camera body, and lens and use them in a filename or folder path.
Do my photos get uploaded anywhere?
Only if you build a step that uploads them, like an API Request node pointed at your own gallery host. Nothing in Watchflows phones home. If an AI node sends an image to a cloud provider for captioning or keywording, that provider sees the image; point the same node at Ollama or Apple Intelligence instead and it never leaves your Mac.
How is this different from Hazel or Image Capture and Automator?
Hazel matches files and runs one action; it doesn't chain a script into an AI call into a notification with a visual timeline showing what happened to each file. Image Capture and Folder Actions are free but brittle, and usually the first thing a macOS update silently breaks. Watchflows keeps the whole pipeline in one visual flow you can watch run.
Can it back up to a NAS or cloud storage like Backblaze or a Synology?
There's no built-in node for a specific NAS or cloud-storage vendor. A Run Script node calling rsync or rclone handles it — that's exactly what the nightly-backup recipe above does, and it works with whatever destination those tools support.
What happens if the SD card offload fails partway through?
Run Script hands back the process exit code as a real payload value, so a Condition node downstream can catch a nonzero exit and fire a notification instead of silently continuing. You also get a live execution timeline and can replay a past run against the same payload, so you can see exactly which file it was on when it stopped.
Watchflows for…
Automate the parts of photography that aren't photography.
$49 one-time, lifetime updates within v1. Free 14-day trial, no credit card. Local-first, no account.
Questions? support@watchflows.app