An adaptive Nextcloud sync client for GTK desktops
  • Rust 99.2%
  • Shell 0.8%
Find a file
aj 7b36370290
All checks were successful
Tag release / tag (push) Successful in 6s
Update README.md
2026-11-07 21:34:34 -06:00
.forgejo/workflows Replace pre-FrogPak workflow with FrogPak workflows 2026-11-07 13:41:52 -06:00
.github/workflows Remove old workflow 2026-11-07 18:31:11 -06:00
assets Revert text shrink, kill monospace log 2026-11-07 20:54:58 -06:00
build-aux Revert text shrink, kill monospace log 2026-11-07 20:54:58 -06:00
docs/screenshots README image width tweak 2026-10-12 18:21:02 -05:00
src Revert text shrink, kill monospace log 2026-11-07 20:54:58 -06:00
.gitignore Add Flatpak packaging and rework the Session tab 2026-11-01 14:11:55 -06:00
.no-sync Add Flatpak packaging and rework the Session tab 2026-11-01 14:11:55 -06:00
Cargo.lock Revert text shrink, kill monospace log 2026-11-07 20:54:58 -06:00
Cargo.toml Revert text shrink, kill monospace log 2026-11-07 20:54:58 -06:00
LICENSE Initial commit (should have happened sooner) 2026-10-11 14:39:21 -05:00
README.md Update README.md 2026-11-07 21:34:34 -06:00
TODO.md Small comment clean up 2026-10-11 16:11:30 -05:00

Ripples icon

Ripples

An adaptive Nextcloud sync client built for GNOME Shell and Phosh using Rust and libadwaita

Screenshots

Session tab in phone mode Transfers in progress Options for resolving a conflict Connections tab in phone mode First page of the add-connection wizard Settings tab in phone mode

Features

Account Options

  • Direct login via Nextcloud's Login Flow v2
  • Alternatively, select account from GNOME Online Accounts (including limited, experimental support for ownCloud and generic WebDAV servers)

Sync Connections

  • Configure multiple local-folder to remote-folder pairs per account
  • Connections can be bidirectional, upload only, or download only
  • Enable/disable switch per connection

Change detection

  • Local changes detected through inotify (GFileMonitor)
  • Nextcloud notify_push used for instant remote change notification when the server supports it
  • A cheap root-ETag check skips full crawls when nothing changed on the server where supported (Nextcloud and ownCloud)
  • Polling and full crawls as fallback and for WebDAV

Correctness

  • Files that look changed on both sides are compared by content hash (XXH3)
  • Large files hashed in parallel 128 MiB chunks using HTTP range requests
  • Local renames and moves detected by inode and replayed as a remote move instead of a delete and re-upload
  • Transfers are atomic: Downloads write a temporary file then rename it, and uploads write a temporary remote object then WebDAV MOVE it into place
  • Large uploads use the Nextcloud chunking API when the server supports it
  • File modifications are gated by a settle time to avoid uploading a half-written file
  • Executable bits survive a re-download

Conflicts

  • Resolution options: Keep Local, Keep Remote, Keep Both (rename local), Keep Both (rename remote)
  • Resolution dialog shows live local and remote details
  • Conflicting items are re-checked every round, so further changes on either side are noticed

Exclusions

  • Global glob patterns (*.tmp, node_modules) with a built-in default list
  • Per-connection excluded folders
  • Honors .no-sync file per directory
  • Maximum file size limit

Power and network

  • Optional automatic pausing of transfers on metered connections
  • Optional automatic pausing of transfers in system power-saver mode
  • Less frequent polling while on battery

Desktop integration

  • Optional System tray icon (SNI)
  • Optional launch at login, started hidden with --hidden
  • Runs in background unless quit from menu or Ctrl+Q

System tray icon showing menu

Installing

AJHub, published with FrogPak FuriHub, published with FrogPak
x86_64 & aarch64 aarch64 only

Limitations

  • Only one active account is allowed at a time
  • Interrupted transfers restart from the beginning
  • POSIX permissions other than the executable bit are not synced
  • Excluded-folder rules are exact paths and do not follow a rename
  • Sync Connections cannot nest or overlap
  • Symlinks are ignored

AI Disclaimer

This project has relied extensively on AI-assisted development, primarily Anthropic's Claude (various models), under human direction and manual testing.

Contribution Profile

Phase                    Human █                  ░ AI
───────────────────────────────────────────────────────
Requirements & Scope      100% ████████████████████  0%
Architecture & Design      75% ███████████████░░░░░ 25%
Implementation              5% █░░░░░░░░░░░░░░░░░░░ 95%
Testing                    90% ██████████████████░░ 10%
Documentation              35% ███████░░░░░░░░░░░░░ 65%

Humorous aside:
These were not the original approximations but Claude expressed that some were "generous to the human side," adding "and I can back that up from the repository." Girl came with RECEIPTS, lol.

License

GPL-3.0-or-later. See LICENSE. The bundled tray icons are from the MoreWaita icon theme (GPL-3.0).