Skip to content

Releases: DR-Tech-Ventures/icloud-gui

iCloud GUI 1.3.1

Choose a tag to compare

@drewrecker drewrecker released this 28 Aug 21:36
4f01c84

Download your iCloud photos to a Mac or NAS. Signed and notarised by Apple, so it opens without any Gatekeeper warnings.

The toolbar stops shifting when you change album. Three things in the top bar changed width whenever the selection moved, and each one moved its neighbours.

  • The toolbar no longer slides sideways with the album name. A unified toolbar lays its items out after the window title, so the grouping picker and the sort button sat a different distance from the left edge for every album — "Recents" and "Recently Added" moved the whole row by the width of eight characters. The controls are now anchored to the trailing edge, and the title grows into the empty space beside them instead of pushing them.
  • The download button keeps one width. Its label carries a count, and the count arrives a moment after the album does because the fetch runs off the main actor — so the button resized itself just after every album change, dragging the three controls to its left along with it. It is now fixed at the width of a six-figure count.
  • The subtitle is never blank. An empty subtitle makes macOS draw the title as a single centred line rather than a stacked title and subtitle, so selecting Hidden or Recently Deleted changed the size and baseline of the album name. Those albums now say "Unavailable to other apps" and the title stays put.

Requires macOS 26. Drag iCloud GUI to Applications from the disk image.

iCloud GUI 1.3 — requires macOS 26

Choose a tag to compare

@drtechventures drtechventures released this 28 Aug 16:56
f5346fb

⚠️ This release requires macOS 26 or later

1.2 ran on macOS 14 and later. If you are on Sonoma or Sequoia, stay on
1.2
— it is complete, it still works, and it does everything this release does that you would notice day to day. macOS will refuse to open 1.3 on an older system rather than misbehaving.

Download your iCloud photos to a Mac or a NAS, at full resolution, using Apple's own PhotoKit framework. Your Apple ID password is never requested or stored, and Advanced Data Protection can stay on.

Signed and notarised by Apple, so it opens without any Gatekeeper warnings.

Installing

Open iCloud-GUI.dmg and drag iCloud GUI onto the Applications shortcut inside.

Keeping it in /Applications rather than running it from ~/Downloads matters here: macOS ties the Photos permission to where the app lives and how it is signed, so an app that moves around gets asked for access again.

What's new in 1.3

The window appears about three times sooner

Measured on a 35,000-asset library: 1.5 seconds down to 0.47.

Every PhotoKit query now runs off the main thread — enumerating albums and counting them, fetching assets, and rebuilding after a library change. Previously all of it ran on the main thread inside the first render, so the window itself could not draw until the whole library had finished loading. Main-thread work at launch went from roughly 800ms to roughly 70ms.

The grid no longer stutters while a download runs. Every library change rebuilt all 35,000 assets on the main thread, and a download makes the library change constantly.

The app icon is drawn by the system

AppIcon.icon is a gradient fill and a single glyph layer — no container, no shadow, no specular highlight. macOS draws all three itself, and differently per appearance (default, dark, clear, tinted), so the glyph picks up real edge lighting and depth instead of the flat bitmap 1.2 shipped.

Under the hood

  • Swift 6 language mode, with compile-time data-race checking. It found three pieces of shared mutable state, including a real data race in the diagnostic probe that happened not to fire. None were annotated away — the state itself is gone.
  • The toolbar's two halves are now separate Liquid Glass groups, via ToolbarSpacer. It needs the macOS 26 SDK, which is why 1.2 left it out.
  • Finder tags use URLResourceValues.tagNames instead of hand-writing a property list into an extended attribute. The attribute written is identical.
  • Launch timings are in the unified log, so "it feels slow" can be answered from a bug report:
    log show --predicate 'subsystem == "com.drtechventures.icloudgui"' --last 1h --style compact
    

Fixes

  • --shot could capture the wrong thing. It waited a fixed nine seconds for the window and gave up if it was not there yet, and applied --album/--group on a separate timer that could lose the race. Affects contributors regenerating screenshots, not people using the app.
  • A library change could cancel the album recount it had just scheduled — the debounce and the enumeration shared one task handle.

Requirements

  • macOS 26 or later
  • Photos signed into iCloud with iCloud Photos turned on

Still true

  • No Apple ID password is ever requested, entered, or stored
  • Advanced Data Protection can stay enabled
  • No analytics, telemetry, crash reporting, or third-party dependencies
  • The only network request the app makes on its own behalf is Check for Updates…, and only when you click it

Full changelog: https://github.com/DR-Tech-Ventures/icloud-gui/blob/main/CHANGELOG.md

iCloud GUI 1.2

Choose a tag to compare

@drtechventures drtechventures released this 28 Aug 04:52
1685e3f

Download your iCloud photos to a Mac or a NAS, at full resolution, using Apple's own PhotoKit framework. Your Apple ID password is never requested or stored, and Advanced Data Protection can stay on.

Signed and notarised by Apple, so it opens without any Gatekeeper warnings.

Installing

This release ships as a disk image. Open iCloud-GUI.dmg and drag iCloud GUI onto the Applications shortcut inside.

Keeping it in /Applications rather than running it from ~/Downloads matters here: macOS ties the Photos permission to where the app lives and how it is signed, so an app that moves around gets asked for access again.

What's new in 1.2

The interface has been rebuilt around the window toolbar, and the app now adopts the Liquid Glass design on macOS 26 and later.

  • Liquid Glass. The app was compiling against the current SDK but telling macOS it was not: SwiftPM stamps the binary's recorded SDK version from the deployment target, so the linked-on-or-after check that gates the new design saw 14.0 and served the old appearance. The build now stamps the real SDK version while the deployment target stays at macOS 14 — macOS 14 through 25 look exactly as before.
  • Controls moved into the toolbar. The title bar was empty while four rows of controls were stacked under the grid. Grouping, sort order, the destination, File Options and Download are now in the toolbar, and what is left below the grid is a single status line.
  • The window has a title again — the selected album and its item count.
  • Filter the sidebar. A search field above the album list.
  • One destination menu replaces the separate Destination button, path button and rescan button.
  • Only new is now Only download what is missing, in File Options. The Download button already said Download 1,247 New when it was on.
  • Check for Updates…, in the iCloud GUI menu. Deliberately manual — a background updater would tell a server this Mac is running the app every few hours, which would make the app's own privacy claim untrue. It sends nothing about you or your library, and installs nothing.
  • Releases ship as a disk image instead of a zip.
  • The window opens wide enough to use — 1280×840, and never narrower than 1180.
  • Thumbnail size is remembered between launches.
  • Item counts are written with thousands separators.

Fixes

  • ./run.sh could silently run the previous build. build.sh deletes the app bundle before reassembling it, but a running instance survives that — macOS keeps the inode alive while the process holds it open — and open then activates that stale process rather than launching what was just built. Same pid, old binary, running against a bundle whose resources no longer exist, which is why it would later vanish with no crash report. build.sh now quits an instance running from its own bundle first, targeted by path so a copy in /Applications is left alone. Affects contributors building from source, not people installing the release.

  • Lifecycle breadcrumbs in the macOS unified log. A launched line with no terminating normally after it is how you tell "killed" from "quit" — a distinction no crash report can make, because being killed is not a crash.

    log show --predicate 'subsystem == "com.drtechventures.icloudgui"' --last 1h --style compact
    

Requirements

  • macOS 14 or later
  • Photos signed into iCloud with iCloud Photos turned on

Still true, and worth repeating

  • No Apple ID password is ever requested, entered, or stored
  • Advanced Data Protection can stay enabled
  • No analytics, telemetry, crash reporting, or third-party dependencies

Full changelog: https://github.com/DR-Tech-Ventures/icloud-gui/blob/main/CHANGELOG.md

iCloud GUI 1.1

Choose a tag to compare

@drtechventures drtechventures released this 28 Aug 01:22

A record of every run is now kept at the destination, and automatic downloads can no
longer start a whole-library transfer on their own.

Added

  • Run log.icloudgui-log.txt beside your photos, with a line per run start, per
    failure and per run end. Failures record the filename, the asset identifier and the
    reason, so a photo that did not make it can be traced back.

    Previously failures lived only in memory and vanished when the app quit. For a backup
    tool, what did not make it is the half that matters, and there was no record of it.

  • Finder tag writes are reported rather than swallowed, so a NAS share that rejects
    extended attributes shows up in the log instead of quietly producing untagged files.
    Look for NOTE Finder tags written on N of M files after a run.

Fixed

  • Automatic downloads are capped at 200 items. Turning on "Download new photos
    automatically" before a first full backup would previously begin transferring the
    entire library unattended — potentially hundreds of gigabytes, with nothing watching
    free space. Larger batches now say so and wait for a click.

  • Hidden and Recently Deleted moved from Library to a new Utilities section
    at the bottom of the sidebar. Both normally read "—" because macOS withholds them, and
    sitting directly beneath All Photos made the first three rows look broken.

  • --album and --group now work without --shot.

Verifying this download

spctl -a -vvv "iCloud GUI.app"

Expect accepted and source=Notarized Developer ID.

Full notes: CHANGELOG.md

iCloud GUI 1.0

Choose a tag to compare

@drtechventures drtechventures released this 27 Aug 21:42

Download your iCloud photos to a Mac or a NAS.

Signed and notarised by Apple — it opens on double-click with no Gatekeeper warnings.

How it works

There is no official iCloud Photos API. Tools built on the unofficial web API need your
Apple ID password and require you to turn off Advanced Data Protection. This one uses
Apple's own PhotoKit framework instead, so:

  • No Apple ID password is ever requested or stored. macOS is already signed in; the
    app asks the system for access to your Photos library.
  • Two-factor authentication and Advanced Data Protection both keep working.
  • Full-resolution originals are pulled from iCloud on demand.

What it does

  • Browse your library grouped by day, month or year, with sticky date headers
  • Download a whole album, or click to pick individual photos
  • Only new — scans your destination and tells you what is actually missing before
    you start, so re-running is a safe incremental backup
  • Date folders or one flat folder, with optional date-prefixed filenames
  • Finder tags for album membership and favourites
  • Live Photos, RAW pairs and burst frames all kept whole
  • Files carry the date the photo was taken, so NAS photo indexers sort correctly
  • Your Mac stays awake for the duration of a long backup

Requirements

macOS 14 or later, with the Photos app signed into iCloud and iCloud Photos enabled.

Three things macOS will not allow

These are Apple restrictions, not missing features — the app lists all three and
explains them rather than hiding them:

  • Hidden photos are withheld from every third-party app while the Hidden album
    requires Touch ID or a password. Turn that off in Photos → Settings → General.
  • Recently Deleted has no API at all. Recover the photos in Photos first.
  • Shared albums hold reduced-size copies (~2048px, video 720p), not originals.

Verifying this download

spctl -a -vvv "iCloud GUI.app"

Should report accepted and source=Notarized Developer ID. Anything else means the app
was altered after signing — don't run it.

Building from source

No dependencies, no Xcode project:

git clone https://github.com/DR-Tech-Ventures/icloud-gui
cd icloud-gui && ./setup-signing.sh && ./run.sh