Skip to content

v1.9.0

Choose a tag to compare

@github-actions github-actions released this 18 Aug 11:09
· 477 commits to main since this release

[1.9.0] — 2026-08-18

Google Photos import, and a pass over the desktop app's interaction gaps. No schema change.
Schema: 28. Builds against the published proton-sdk / proton-drive-rs 0.6.1 — the album
writes this release needs are in the registry crates, so the local [patch.crates-io] shim the
feature was developed against is gone and no local path dependency remains.

Added

  • Import a Google Photos Takeout export into Proton Photos — pdfs import-google-photos takeout-*.zip (add --dry-run to see what it would do, --wait to follow it), or the import
    button in the Photos header, which multi-selects the export's zips. Albums in the export are
    recreated as Proton albums and their photos filed into them; year folders and Archive/ import
    into the timeline; Trash/ is skipped. Capture times and favourites come from Google's per-photo
    JSON sidecars, including the truncated and (N)-swapped sidecar names Google produces.

  • Photos already on the account are not re-uploaded: the import asks the photos volume which of
    the export's names exist (batched, 150 per request), reads and SHA-1s only those files, and skips
    the ones whose content digest matches too — Proton's own duplicate rule. A library already partly
    synced by Proton Photos on a phone therefore imports only what is missing, and an interrupted
    import resumes by being run again. Google keeps a full copy of a photo in every album folder it
    appears in; those fold into one upload that joins several albums.

  • The import streams each photo straight out of its zip, so an export needs no scratch space to
    unpack into, and reports as a job in pdfs transfers and the GUI's activity view. pdfs import-status shows the counts, pdfs cancel-import stops it — a cancelled run still files what
    it uploaded into its albums.

  • An Import page in the GUI (Settings → Import from Google Photos, or the import button in
    the Photos header). Archives are staged by drag-and-drop onto the page or through the file
    chooser, listed with their sizes so the set can be checked before anything is sent, and launched
    as either a Scan (dry run) or a confirmed Import. The page shows live progress off the import's
    job, keeps the finished run's report on screen, and can stop a run in flight; because the import
    outlives the page, it is polled wherever the user navigates and its completion is reported as a
    desktop notification.

  • SDK (proton-sdk-rs 0.6.1): album writes — ProtonPhotosClient::create_album and
    add_photos_to_album, ported from the TypeScript SDK (upstream C# has no album write API), plus
    batch duplicate detection (find_duplicates_many, name_collisions). The workspace deps moved
    "0.6.0" → "0.6.1" and Cargo.lock re-resolved to the registry crates. Adding a photo from an
    album shared with us (a different volume) is still unported and fails that photo's outcome.

  • Multi-select in Files. Both views select a batch (click-drag, Ctrl-click, Shift-click); a bar
    slides in reporting the count and offering Move to Trash and offline on/off for the whole
    selection. Delete acts on everything selected, Esc clears it, and right-clicking inside a
    selection offers the batch actions rather than the one row under the pointer. Actions that need a
    single subject — rename, move, share, revisions — stay single-entry, and the details pane steps
    aside for a batch instead of speaking for it.

  • Undo on trash. "Moved X to Trash" now carries an Undo that restores the batch, single files
    included.

  • The empty states are a place to act: an empty folder offers Upload files / New folder, and an
    empty photo timeline offers Upload photos / Import from Google Photos, instead of describing what
    the user could go and do elsewhere.

  • Ctrl+F works from any page, navigating to Files and focusing the search box, rather than being
    silently inert everywhere but Files.

  • Staged Takeout archives survive closing the window; archives that have since been moved or deleted
    are dropped from the restored set.

Fixed

  • Settings showed the local cache as "X of 0 B used" when no cache budget was set. An unset budget
    means unlimited, so it now reads "X cached — no limit set" rather than implying a zero cap.
  • The cache-budget editor fired a SetCacheBudget round-trip — and a toast — on every step, so a
    run of + clicks applied a series of caps the user never asked for and stacked a column of
    toasts. It now waits for the value to settle.
  • A long pin list pushed everything below it off the end of Settings. It shows the first six with a
    "Show all N" row for the rest.