A lightweight, keyboard-driven desktop app for syncing local project folders with cloud storage via rclone.
Built with Tauri v2 + Svelte 5. Cross-platform (macOS, Windows, Linux).
Local is always authoritative. Push is the default. Pull and Bi-Sync require explicit confirmation with Cancel focused by default. Delete only removes the local copy — the remote is never touched.
# macOS (Homebrew)
brew install rclone
# Windows (Scoop)
scoop install rclone
# Or download from https://rclone.org/downloads/
rcsync doesn't handle authentication — rclone does. Set up your remotes first:
# Interactive setup — follow the prompts
rclone config
# Example: set up Google Drive
# Choose "Google Drive", follow OAuth flow, name it "gdrive"
# Example: set up OneDrive
# Choose "Microsoft OneDrive", follow OAuth flow, name it "onedrive"
After setup, verify your remotes work:
# List configured remotes
rclone listremotes
# Test access
rclone lsd gdrive:
rclone lsd onedrive:
rcsync expects projects to be folders under a base path on the remote. For example:
gdrive:proj/
├── my-webapp/
├── data-pipeline/
└── ml-experiment/
Push a project for the first time:
rclone sync ~/projects/my-webapp gdrive:proj/my-webapp
After that, rcsync handles all subsequent syncs through the UI.
git clone https://github.com/smkwray/rcsync.git
cd rcsync
npm install
npx tauri build
The built app is at src-tauri/target/release/bundle/.
npx tauri dev
rcsync uses two config files:
defaults.json (public, ships with the app)Contains exclude patterns and default scan directories. Safe to check into version control and share across devices.
{
"excludes": [
"node_modules/**", ".git/**", ".venv/**",
"__pycache__/**", "src-tauri/target/**",
".DS_Store", "._*"
],
"scan_dirs": ["~/projects"],
"default_pull_dir": "~/projects"
}
rcsync-config.json (private, gitignored)User-specific settings — remotes, projects, paths. Stored next to the app binary (portable) so it can sync between devices via Syncthing.
{
"rclone_path": "rclone",
"remote": "gdrive",
"remotes": [
{ "name": "gdrive", "base_path": "proj" },
{ "name": "onedrive", "base_path": "Projects" }
],
"extra_excludes": ["dist/**", "*.log"],
"scan_dirs": ["~/projects", "~/code"],
"projects": [],
"auto_check_on_launch": false
}
Default excludes are always applied. extra_excludes adds your own patterns on top — both are shown in Settings, but defaults can't be removed from the UI.
| Setting | File | Description |
|---|---|---|
excludes |
defaults.json | Base exclude patterns (shared) |
extra_excludes |
rcsync-config.json | Additional user excludes (merged with defaults) |
remote |
rcsync-config.json | Active remote name |
remotes |
rcsync-config.json | Available remotes with their base paths |
scan_dirs |
rcsync-config.json | Local directories to scan for project folders |
auto_check_on_launch |
rcsync-config.json | Run Check All when the app opens |
rclone configremotes in rcsync settings (or edit the config file)Toggle with the Keys checkbox or Cmd+K.
| Key | Action | Always on? |
|---|---|---|
j / k |
Navigate down / up | |
l / ; |
Navigate left / right | |
a |
Push selected | |
s |
Dry Run | |
d |
Check | |
f |
Bi-Sync | |
g |
Pull | |
h |
Delete local | |
/ |
Focus filter | |
c |
Check All | |
p |
Push All | |
o |
Toggle output | |
b |
Browse Remote | |
? |
Shortcut help | Yes |
Cmd+, |
Settings | Yes |
Cmd+K |
Toggle shortcuts | Yes |
Cmd+O |
Toggle output | Yes |
Esc |
Close / deselect | Yes |
rclone sync local remote — one-way upload, local winsrclone sync remote local — one-way download, remote winsrclone bisync local remote — two-way mergerclone check --combined — compare without changing anythingrclone sync --dry-run — preview what Push would doAll operations respect the configured exclude patterns.
MIT