Skip to content

Desktop app overview

Proton Drive Sync is a desktop app for Linux, built with Tauri. It gives the daemon a face: live status, an activity ledger, side-by-side conflict resolution, a dry-run review before destructive passes, settings, an onboarding wizard, and a system-tray indicator.

The app owns no sync logic and no index of its own. Everything it shows comes from the daemon’s real surface:

SourceSupplies
Control socket ($XDG_RUNTIME_DIR/proton-sync.sock)Live status, history, pending deletions, and the pause / resume / syncnow / approve / deny / shutdown commands.
Config file (~/.config/proton-sync/proton-sync.toml)Everything in Settings. The app edits this file in place.
.proton-cloud sidecars on diskConflict resolution — plain file operations, no new IPC verb needed.
proton-syncd --dry-runThe Plan preview and onboarding review.
The SQLite index (read-only)File-manager emblems.

Because the app reads the same socket and files as the CLI, the two never disagree. Closing the app’s window never stops the daemon — the window hides to the tray and syncing continues.

The app polls the daemon’s status on a timer — every 2 seconds when focused, every 10 seconds when in the background — plus a periodic conflict re-scan and a refresh of pending deletions. A socket error is its own explicit state; counters never render as a misleading zero when the daemon is unreachable — they show an em-dash instead.

Both the window and the tray derive one shared daemon state from the status reply (or its absence), so they always agree. Each state drives the headline, the available actions, the tray icon, and whether counters are shown:

StateMeaningPrimary actions offered
RunningReachable, not paused, changes pending — actively syncing.Sync now, Pause
IdleReachable, not paused, nothing pending — up to date.Sync now, Pause
PausedSync is paused.Resume
Auth expiredProton sign-in looks expired (heuristic from the last error).Re-authenticate (proton-drive login), Pause
UnreachableThe control socket can’t be reached, or the reply couldn’t be trusted.Start proton-syncd, View journal
First runNothing has synced yet.Preview plan, Choose folders (→ onboarding)

In the Unreachable and First run states, the app deliberately shows no counters (no fake “0 pending”) — unknown is not zero.

The app runs sync commands for you over the socket (sync now, pause, resume, approve/ deny deletions, resolve conflicts, edit the config). A few system-level actions it shows you the command to run rather than running silently — starting the service (systemctl --user start proton-syncd), viewing the journal (journalctl --user -u proton-syncd), and re-authenticating (proton-drive login) — so nothing surprising happens on your behalf.

The app is careful not to imply capabilities the daemon doesn’t have. A few examples you’ll notice:

  • Transfer progress is indeterminate. The daemon reports in-flight progress as [i/N] file counts on stderr only; it never crosses the socket, so the app shows a moving bar and file counts, not a fabricated percentage.
  • Applying a reviewed plan is a fresh pass. Dry-run and the real reconcile are separate invocations, so the applied plan can differ from the reviewed one — the app says so.
  • One folder pair. The daemon syncs one local↔remote pair; the folder selector is shaped for more, but one is the reality today.

Continue to Screens for a tour of each view, or Tray & notifications for the background indicator.