Skip to content
Syncophant

01 · Open source · five platforms

Sync without surrendering control.

Pair a local folder with S3, WebDAV, or SFTP. Preview the plan, then push, pull, or sync both ways. No account, no telemetry, nothing in the middle.

Account
None
Telemetry
None
License
AGPL-3.0
The Pairings screen of the macOS build: three pairings with their route, schedule, status and last sync, one with a conflict to review
Pairings · macOS build1 conflict to review

02 · Direction

Push, pull, or sync both ways.

Every folder pairing says which side leads. You can change it later, but the next run is never ambiguous.

Push
Photography → Cloudflare R2/photos
Pull
Project archive ← Home server/projects
Two-way
Obsidian vault ⇄ Nextcloud/vault
LocalFolder
RemoteStorage

This device leads.

Local changes upload. Files you remove here are removed there too, once the plan clears your delete guard.

The new pairing sheet on macOS with Push selected: folder name, direction chooser, destination account and remote folder
New pairing · macOS buildDirection is step two

Direction in plain language

The sheet names your own machine while you choose. Push reads: on this Mac, this folder is the source of truth. New and changed files upload, and files you delete here are removed there too.

Credentials go to the system keychain · never to a file

03 · Preview and deletion

See the plan before anything moves.

Every run can be previewed: what uploads, what downloads, what would be removed, counted and totalled. A run that would remove 10 or more files and more than a quarter of the destination stops and asks first.

Counted, then confirmed

The plan lists every file with its size and reason. Nothing is transferred until you tap through it.

Large deletions pause

It can delete files, because mirroring a deletion is the point of push and pull. So the guard names the number and waits.

04 · Conflicts

Conflicts wait for you. They never block.

Edit the same file in two places and both versions are kept, already on disk. The open conflict names your copy and theirs, and the three buttons are the whole decision. The pairing keeps running meanwhile.

Pairing detail for Obsidian vault with one conflict open: both copies of Daily/2026-08-31.md are named, with Keep mine, Keep theirs and Keep both buttons, above the recent runs
1 conflict open · macOS buildBoth versions kept until you choose
Keep mine
Your copy wins and the other is replaced on the next run.
Keep theirs
The remote copy wins, and yours is kept until the run completes.
Keep both
Your copy is renamed with the device name and date. The other keeps its name.

05 · Storage

Storage you already own.

A bucket, a Nextcloud, a box you can SSH into. Files are stored as plain files, so the remote stays browsable and you are not locked in.

  • S3-compatible

    AWS S3, Cloudflare R2, Backblaze B2, MinIO, Wasabi. Endpoint, bucket, access key, and secret. Reports no checksum for multipart uploads rather than pretending to have one.

  • WebDAV

    Nextcloud, ownCloud, Apache mod_dav, Fastmail Files. Any server that answers a Depth-1 PROPFIND. Server URL, username, and password.

  • SFTP

    Any SSH server. Host, port, username, and base path, then a password or a private key.

A GitHub provider is written and waiting on its first run against a real repository. Google Drive, Dropbox, and OneDrive are planned. None of them appear in the app until they can connect.

06 · No middle

Nothing sits in the middle.

Each device talks straight to the storage you configured, using credentials you supply. There is no Syncophant cloud, account, relay, or telemetry endpoint in between.

Read the source

This deviceLocal folderStudio Notes
Your storageStudio DriveWebDAV · notes
Credentials
System keychain
Runs on
macOS, Windows, Linux, Android
Transport
HTTPS or SSH

07 · Get it

Download and run it.

Each link points at the newest tagged release. Configuration lives in your user directory, and uninstalling leaves nothing behind on the remote: your files stay where they are.

Build from source

Needs the Flutter SDK. The sync engine is plain Dart and its tests run without Flutter at all.

git clone https://github.com/Syncophant/app.git
cd app && dart pub get
cd apps/syncophant && flutter run -d macos

Signing is optional in the build, so your system may warn about an unsigned app. Each release says which artifacts were signed.

08 · Questions

Questions people ask.

Anything missing? The issue tracker is the fastest way to reach us.

Do I need a Syncophant account?

No. There is no Syncophant server. Each device talks straight to the storage you configured, using credentials you supply, and those credentials stay in the platform keychain.

What happens when I edit the same file in two places?

In two-way mode Syncophant keeps both versions. Your copy is renamed with the device name and date, the other keeps its name, and the pair waits in a review queue until you choose Keep mine, Keep theirs, or Keep both.

Can it delete my files?

It can, because mirroring a deletion is the point of push and pull. A run that would remove 10 or more files and more than a quarter of the destination stops and asks first, and every run can be previewed before it applies anything.

Does background sync work on a phone?

Partly, and the app says so. Android runs background work at most every 15 minutes and delays it to save battery. iOS decides on its own schedule and may skip days. Both also sync whenever you open the app, which is the only timing either can promise.

Is my data encrypted?

Transport uses whatever your storage speaks, normally HTTPS or SSH. Files are stored as plain files so the remote stays browsable and you are not locked in. There is no client-side encryption yet.

Why does my system warn that the app is unsigned?

Because it probably is. Signing certificates are optional in the build, so a release is only signed when those secrets are configured. Every release lists which artifacts were signed and ships a SHA256SUMS.txt you can check the download against.