Repository navigation
v1.9.0
[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-runto see what it would do,--waitto 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 andArchive/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 inpdfs transfersand the GUI's activity view.pdfs import-statusshows the counts,pdfs cancel-importstops 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-rs0.6.1): album writes —ProtonPhotosClient::create_albumand
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"andCargo.lockre-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
SetCacheBudgetround-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.