macOS menu bar app
CardSync
for Google Photos
Slot in the card. Walk away. Your new photos and videos are in Google Photos by the time you've made a cup of tea.
Import finished
Card “EOS_DIGITAL” · 4 min 12 s
The summary always separates what changed from what didn't, so a re-inserted card reads “nothing to do” rather than looking like a 4,000-file event.
What it does
Four promises, kept.
Automatic
Insert a card you've used before and the upload starts on its own. No window to open, no button to find.
Asks once per card
The first time it meets a card it asks what to send — all of it, or only shots from a date onwards — so a card full of history never gets uploaded behind your back.
De-duplicating
Every file is matched on its contents and on its capture metadata. Re-inserting a card, copying a card or renaming files never causes a second upload.
Non-destructive
Nothing on the card is ever modified or deleted. CardSync opens files to read them and that is the entire extent of its ambition.
The clever bit
How it knows
it's seen a
photo before
Each file runs down this ladder and stops at the first match. The cheap checks come first, so a card you've imported before costs almost nothing to re-scan.
Filenames are deliberately never used as identity — cameras reset their
counters, so DSC_0001.JPG refers to a great many different
photos over a card's life.
-
Quick key
Volume UUID + path + size + modification time. Catches the same file on a card you've already imported.
Cost: no file read at all
-
Content hash
SHA-256 of the file itself. Catches the same file under any name, on any card.
Cost: reads the file
-
Shot key
Capture time to the sub-second, camera make, model and serial, dimensions and media class. Catches the same shot re-encoded, renamed or exported.
Cost: metadata only
-
Within this card
Catches the same photo appearing twice on one card.
Cost: free
Bursts stay safe
The shot key is only trusted when the camera wrote a sub-second timestamp. Without one, a burst can put several genuinely different frames in the same second — so those files fall back to content hashing alone, and the count is reported in the summary rather than quietly guessed at.
RAW + JPEG both upload
Media class is part of the shot key, so a .CR3 and its
.JPG sibling produce different keys despite sharing a
timestamp. Both go up, as you'd want.
The honest bit
One thing CardSync
genuinely cannot do
It can't ask Google what you already have
Since Google's March 2025 API changes, a third-party app can only append to your library. No scope lets an app read what is already in your Google Photos account.
So CardSync answers “do you already have this?” from its own local record of everything it has sent. A photo that reached Google Photos by some other route — phone backup, the web uploader, a previous tool — is invisible to it, and a card containing that photo would be uploaded again.
That is exactly what the new-card prompt is for. The first time a card is inserted, you pick a starting point and everything older is left alone. After that first import the card is known, and every later insert uploads only what's new.
The first time you insert a card, you get three choices
Everything on the card
All of it, no questions.
Only since a date
That day onwards, inclusive.
A date range
Both endpoint days, inclusive.
The file count updates as you move the dates, so you can see exactly what's about to happen before anything leaves the card. Choose “not now” and the card stays unknown — it'll ask again next time.
The rest of it
Small print, large type
-
Requires
macOS 14 or later, and a Google account.
-
Lives in
The menu bar. No Dock icon, no app window unless you open Settings.
-
Triggers on
Volumes containing a DCIM folder, so plugging in an ordinary USB drive does nothing. A manual upload can scan any volume.
-
Big files
Anything over 32 MB uses Google's resumable upload protocol, so a dropped connection doesn't discard a large video.
-
Where photos land
Your main library, sorted by capture date. No albums are created. Uploads count against your Google account storage.
-
Signing in
A browser window opens and the app catches the redirect on a temporary local listener. Nothing is exposed to the network. Your refresh token goes to the macOS keychain.
-
Privacy
Crash reports and anonymous counters only — never filenames, paths, card names, EXIF, camera serials or your Google account. Read the privacy policy →