Old Norse · /ˈflɪt.ja/ · to move, to transport
Two-way file sync between your Mac and any device — Android, Linux, Mac, or Windows — over your local network or from anywhere via Tailscale. No cloud. No subscription. No background service running on your machine.
Go to Releases and grab the file for your platform:
| Platform | File to download |
|---|---|
| macOS (Apple Silicon) | Flytja_x.x.x_aarch64.dmg |
| macOS (Intel) | Flytja_x.x.x_x64.dmg |
| Linux | flytja_x.x.x_amd64.AppImage |
| Windows | Flytja_x.x.x_x64-setup.exe |
macOS note: on first launch, right-click the app → Open → Open. macOS will ask once because the app isn't signed through the App Store. After that it opens normally.
Linux note: make the AppImage executable before running: chmod +x flytja_*.AppImage
Flytja compares files on both sides by hash (not timestamp) and only moves what actually changed. It scans the entire local and remote folder recursively — all subfolders are included, as long as the file type matches your filter. It handles conflicts gracefully — if both sides edited the same file, it keeps your local version and saves the remote version alongside it as filename.device-conflict-TIMESTAMP.ext so nothing is lost.
Three ways to connect:
| Transport | Use for |
|---|---|
| Android (adb) | Syncing with an Android device over Wi-Fi |
| SSH / LAN | Syncing with a Linux or Mac machine |
| Windows Share | Syncing with a Windows machine via a mounted network share |
Tailscale (optional, recommended) — install on both devices and sign into the same account. Your devices get private IP addresses that work from anywhere without opening firewall ports.
Instead of hitting Sync now by hand, set auto-sync to an interval (presets, or type any number of minutes ≥ 1) and Flytja re-syncs on that schedule — while the app is open. Nothing runs in the background on your Mac; close Flytja and the schedule stops.
It's built to be safe to walk away from:
- Calibration — when you enable auto-sync, Flytja first runs a one-time dry run to measure how long a scan of your folder takes. If that's longer than your chosen interval, it refuses to arm and tells you to pick a longer one — so you can't accidentally set it to run back-to-back.
- No pileup — if a scheduled sync comes due while one is still running, it's skipped, never queued. A too-short interval can't stack up runs.
- Auto-pause — if syncs keep overrunning the interval (e.g. the folder grew), Flytja pauses auto-sync on its own and shows why, rather than grinding continuously unattended.
Tip: run a dry run once first to see how long a scan takes, then pick an interval comfortably above that.
- Install Android SDK Platform Tools on your Mac — this provides the
adbcommand:- Via Homebrew:
brew install android-platform-tools - Or install Android Studio and use its built-in SDK Manager (SDK Tools → Android SDK Platform-Tools).
- Via Homebrew:
- Enable USB Debugging on your device (Settings → About → tap Build Number 7 times → Developer Options → USB Debugging).
- Connect via USB once and run:
adb tcpip 5555 - Unplug. The device is now reachable over Wi-Fi.
- In Flytja: select Android, enter the device IP and port
5555, hit Test connection.
- Enable SSH on the remote machine:
- Linux:
sudo systemctl enable --now sshd - Mac: System Settings → General → Sharing → Remote Login
- Linux:
- Set up an SSH key so sync works without a password prompt:
ssh-keygen -t ed25519 ssh-copy-id user@host - In Flytja: select SSH / LAN, enter your username, host IP, and optionally your key path.
- On Windows: enable File Sharing (Settings → Network → Advanced sharing settings).
- On your Mac: Go → Connect to Server (
⌘K) →smb://windows-ip/ShareName→ Connect. - In Flytja: select Windows Share, set the mounted path (e.g.
/Volumes/ShareName).
Flytja supports multiple named profiles — one per device or sync task. Each profile stores its own connection settings, file patterns, and a notes field for reminders. Settings auto-save after every change.
Click Export script… in the actions bar to save a standalone Python script with your current profile baked in. You can run it from the terminal without opening Flytja:
python3 skies-sync.py # sync files
python3 skies-sync.py --dry-run # preview without moving anythingSchedule with cron (open with crontab -e):
0 * * * * /usr/bin/python3 ~/Scripts/skies-sync.py
Always-on sync on macOS (launchd): the exported script includes a commented launchd .plist template near the top — copy it, fill in the path, and load it with launchctl load.
Remote trigger over SSH:
ssh user@100.x.x.x python3 ~/Scripts/skies-sync.pyRe-export any time your profile changes.
You'll need Node.js (v18+) and Rust.
git clone https://github.com/afluffywaffle/flytja
cd flytja
npm install
npm run tauri buildThe built app appears in src-tauri/target/release/bundle/.
Linux build dependencies:
sudo apt-get install libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelfMIT