Cloud sync for Linux,
done right.

On-demand virtual filesystem. Multi-backend via rclone. Conflict-safe bidirectional sync. No data loss.

FUSE3 70+ backends Rust MIT / Apache-2.0
Get Started View on GitHub
~/GoogleDrive/                  ← FUSE3 virtual mount
├── Documents/
│   ├── report.pdf              ← hydrated (local cache)
│   └── draft.docx              ← placeholder (fetched on open)
└── Photos/
    └── 2025/                   ← listing from remote index

Why stratosync?

Linux has excellent cloud sync tools, but none that combine on-demand hydration, native filesystem integration, and conflict safety.

ApproachOn-demandNative FSConflict-safeMulti-backend
stratosyncyesyes (FUSE)yesyes (70+)
rclone mountyesyes (FUSE)noyes
rclone bisyncnono (CLI)partialyes
Insync / OverGrivenopartialpartiallimited
GNOME Online AccountsnoGVFS onlynolimited

On-demand hydration

Files appear instantly with real names and sizes. Content downloads only when you open a file. Subsequent reads use the local cache.

Bidirectional sync

Edits save to local cache immediately and upload in the background after a debounce window. fsync() triggers instant upload.

Conflict resolution

Concurrent edits trigger automatic 3-way merge for text files, or produce .conflict siblings for binary files. Content-hash ETags ensure no silent overwrites.

📦

Cache management

Bounded LRU cache with configurable quota. Least-recently-used files are evicted locally but remain in the cloud. Pinned files are never evicted.

🔌

70+ cloud backends

Powered by rclone. Google Drive, OneDrive, Dropbox, S3, Nextcloud, SFTP—any rclone remote works as a stratosync mount.

🛠

Native filesystem

FUSE3 mount works with every tool: ls, cat, vim, cp, your IDE, your file manager. No special client needed.

New in v0.12.0

Phase 5: power-user features for daily use.

🔍

Selective sync

Per-mount ignore_patterns glob list keeps node_modules/, *.tmp, build artefacts out of the index, the FUSE mount, and the upload queue.

🕘

Bandwidth schedule

Per-mount upload_window = "22:00-06:00". Uploads only dispatch in the local-time window. fsync() always bypasses.

📂

File versioning

Snapshots before each remote-replace and after each upload. stratosync versions list/restore brings back any of the last N versions; deduplicated against the merge base store.

📊

Prometheus metrics

Opt-in GET /metrics with per-mount cache, queue, hydration, conflict, and poller gauges. Hand-rolled HTTP/1.1 — no axum/hyper baggage.

💻

Live dashboard

stratosync dashboard — ratatui TUI showing per-mount sync state, upload queue, hydration, and poller status updating in real time over the daemon IPC socket.

🔒

Multi-account isolation

Personal + work Google Drive? Two rclone remotes, two [[mount]] blocks. Total isolation: separate DB, cache, OAuth token, upload queue, and sidecar port.

Prerequisites

Linux

x86_64 or ARM64
with FUSE3 support

FUSE3

apt install fuse3
or dnf install fuse3

Quick Start

From zero to mounted cloud drive in four steps.

1. Configure an rclone remote

rclone config                     # interactive setup for your cloud provider
rclone lsd gdrive:                # verify it works

2. Install stratosync

# Debian / Ubuntu
curl -LO https://github.com/dmcbane/stratosync/releases/latest/download/stratosync_0.12.0_amd64.deb
sudo dpkg -i stratosync_0.12.0_amd64.deb

# Fedora / RHEL
curl -LO https://github.com/dmcbane/stratosync/releases/latest/download/stratosync-0.12.0-1.x86_64.rpm
sudo dnf install ./stratosync-0.12.0-1.x86_64.rpm

# Arch (AUR)
yay -S stratosync-git

# Any distro (tarball)
curl -LO https://github.com/dmcbane/stratosync/releases/latest/download/stratosync-0.12.0-linux-x86_64.tar.gz
tar xzf stratosync-0.12.0-linux-x86_64.tar.gz
sudo cp stratosync-0.12.0-linux-x86_64/stratosync* /usr/local/bin/

ARM64 packages also available — replace amd64/x86_64 with arm64/aarch64. See all downloads on the releases page.

3. Configure a mount

# ~/.config/stratosync/config.toml

[daemon]
log_level = "info"

[[mount]]
name          = "gdrive"
remote        = "gdrive:/"          # rclone remote name
mount_path    = "~/GoogleDrive"     # where files appear
cache_quota   = "10 GiB"
poll_interval = "30s"

4. Start the daemon

stratosync daemon start            # wraps systemctl --user start stratosyncd
ls ~/GoogleDrive/                  # your cloud files are here

Build from Source

For development or if prebuilt packages aren't available for your platform.

Rust 1.80+

rustup update stable

libfuse3-dev

apt install libfuse3-dev

pkg-config

apt install pkg-config

git clone https://github.com/dmcbane/stratosync
cd stratosync
./install.sh                       # builds, installs to ~/.local/bin, enables systemd service

Usage

Once mounted, cloud files work like any local directory.

Filesystem operations

# Browse
ls ~/GoogleDrive/Documents/

# Read (downloads on first access)
cat ~/GoogleDrive/report.pdf

# Edit (uploads automatically)
vim ~/GoogleDrive/notes.md

# Create, copy, move, delete
cp local.txt ~/GoogleDrive/
mv ~/GoogleDrive/old.txt ~/GoogleDrive/new.txt
mkdir ~/GoogleDrive/NewFolder

CLI commands

# Sync status & live dashboard
stratosync status
stratosync dashboard         # live TUI

# List remote contents
stratosync ls [path]

# Offline pinning
stratosync pin   ~/Drive/important.pdf
stratosync unpin ~/Drive/important.pdf

# Configuration
stratosync config show|test|edit

# Conflict management
stratosync conflicts
stratosync conflicts cleanup [--dry-run]
stratosync conflicts merge ~/Drive/notes.md

# File version history
stratosync versions list    ~/Drive/notes.md
stratosync versions restore ~/Drive/notes.md --index 1

Architecture

Three-crate Rust workspace. No runtime dependencies beyond rclone and FUSE3.

~/Cloud/ (FUSE3 mount)
stratosync-daemon stratosyncd binary
FUSE layer
fuser crate
Sync Engine
upload queue
remote poller
conflict resolve
3-way merge
Cache Manager
LRU eviction
configurable quota
base version store
stratosync-core
Backend trait
RcloneBackend
DeltaProviders
StateDb
SQLite + WAL
per-mount DB
Config
TOML parsing
mount configs
rclone subprocess
rclone (any provider)

stratosync-core

Pure types, Backend trait, StateDb (SQLite), BaseStore (SHA-256 object store), delta providers, config structs. No FUSE, no network.

stratosync-daemon

FUSE filesystem, sync engine with 3-way merge, cache manager, inotify watcher, delta poller. Tokio async runtime with FUSE bridge.

stratosync-cli

User-facing CLI via clap. Status, file listing, config management, conflict resolution.

Configuration

All settings in a single TOML file at ~/.config/stratosync/config.toml.

Daemon settings

[daemon]
log_level = "info"

[daemon.fuse]
threads         = 4
attr_timeout_s  = 5
entry_timeout_s = 5
allow_other     = false

[daemon.sync]
max_hydration_concurrent  = 4
max_upload_concurrent     = 2
upload_debounce_ms        = 2000
text_conflict_strategy    = "merge"   # or "keep_both"
base_retention_days       = 30

[daemon.metrics]                # Prometheus, off by default
enabled     = false
listen_addr = "127.0.0.1:9090"

Mount settings (repeatable)

[[mount]]
name              = "gdrive"
remote            = "gdrive:/"
mount_path        = "~/GoogleDrive"
cache_quota       = "10 GiB"
poll_interval     = "30s"
enabled           = true

# Phase 5 features (all optional)
ignore_patterns   = ["*.tmp", "node_modules/**"]
upload_window     = "22:00-06:00"   # local time
version_retention = 10              # 0 to disable

[mount.eviction]
policy    = "lru"
low_mark  = 0.80
high_mark = 0.90

Roadmap

Stratosync is in beta (v0.12.0-beta.1). Here's what's done and what's next.

Done

Phase 1: Read-Only VFS

FUSE3 mount with on-demand hydration. Files appear instantly, content downloads on open(). Systemd service, basic CLI.

Done

Phase 2: Bidirectional Sync

Write, create, mkdir, rename, delete. Upload queue with debounce. Remote poller. LRU cache eviction. Crash recovery.

Done

Phase 3: Conflict Resolution & Safety

3-way text merge via git merge-file. Content-hash ETag detection. Delta APIs for Google Drive and OneDrive. Base version store. Desktop notifications. xattr sync status. conflicts resolve CLI (keep-local, keep-remote, merge, diff).

Done

Phase 4: Performance & UX

Pin/unpin for offline. Range-read fast path. Readdir prefetch. Nautilus emblem extension. System tray indicator. WebDAV sidecar backend. Distribution packaging (.deb, .rpm, AUR) for x86_64 and ARM64.

Done

Phase 5: Advanced Features

Selective sync (per-mount ignore_patterns). Bandwidth scheduling (per-mount upload_window). File versioning with CLI list/restore. Prometheus /metrics endpoint. Multiple accounts per provider (per-mount isolation). Live dashboard TUI. Conflicts cleanup CLI. Encrypted cache deferred to v0.13.0.

In progress

Phase 6: File Manager Integration

Context-menu actions shipped on every targeted file manager — Nautilus / Nemo / Caja, Dolphin / Konqueror, PCManFM / PCManFM-Qt, Thunar. Sync-status emblem overlays shipped on every desktop with a native overlay API: GTK trio via Python plugins, Dolphin / Konqueror via a KF6 KOverlayIconPlugin C++ plugin (separate stratosync-dolphin-overlay subpackage). Thunar and PCManFM ship actions only — neither has a native emblem API, so an alternative (thumbnailer badge or sidebar panel) is the remaining open question.