Sync Phones and Handheld Devices with Linux
Sync Android phones with Linux using MTP for file transfer and KDE Connect or GSConnect for wireless integration. Includes PalmOS history and CalDAV setup.
Before you start
- ▸A USB cable capable of data transfer (not charge-only)
- ▸Android device running Android 6.0 or later
- ▸Both devices on the same LAN segment for wireless features
- ▸sudo/root access to install packages and modify udev rules
Syncing phones and handhelds with Linux has come a long way from the days of USB cradles and brittle Palm HotSync daemons. Today the landscape splits cleanly into two worlds: wired MTP transfers for file copying, and wireless protocol stacks like KDE Connect and GNOME's GSConnect for deep integration. This guide covers both, plus a look back at where handheld sync on Linux started.
A Brief History: PalmOS Sync on Linux
Before Android existed, millions of people carried Palm Pilots, Visors, and Treos. The Palm HotSync protocol was proprietary, but the community reverse-engineered it into pilot-link, a suite of command-line tools that spoke directly to Palm devices over serial or USB. Desktop applications like GNOME Pilot and KPilot wrapped pilot-link to sync contacts, calendars, and memos with Evolution and KOrganizer.
That era is over. pilot-link hasn't been maintained since the early 2010s, and no modern distribution ships it by default. PalmOS devices are collector items. The architecture it introduced — a daemon mediating sync sessions over a transport — is recognizable in every modern sync stack, though.
Wired File Transfer: MTP
Android devices switched from USB Mass Storage to the Media Transfer Protocol (MTP) around Android 4.0. Unlike mass storage, MTP doesn't expose a raw block device; the phone's software mediates every file operation. This makes MTP safer for the phone's filesystem but historically finicky on Linux.
Install the MTP stack
The core library is libmtp. Most desktop environments also need gvfs-mtp (GNOME/GTK) or kio-extras (KDE Plasma) to get file-manager integration.
# Debian / Ubuntu
sudo apt install libmtp-runtime gvfs-mtp mtp-tools
# Fedora / RHEL family (RHEL 9+, Rocky 9+)
sudo dnf install libmtp gvfs-mtp
# Arch Linux
sudo pacman -S libmtp gvfs-mtp android-tools
On KDE Plasma, kio-extras is usually installed already; if not, add it with your package manager. After installing, replug the phone.
Set the phone to MTP mode
Plug in the USB cable, then pull down the Android notification shade and tap the USB connection notification. Select File Transfer (MTP) — not "Charging only" or "PTP". The phone must be unlocked the first time; Android requires you to trust the host.
Verify detection
mtp-detect
You should see your device's make, model, and storage list. If you see "No raw devices found", the phone is still in charging mode or you need a udev rule (see Troubleshooting).
Mount in a file manager
In Nautilus (GNOME) or Dolphin (KDE), the phone appears in the left sidebar automatically once detected. You can drag files in and out normally. For command-line access, jmtpfs or go-mtpfs can FUSE-mount the device:
sudo apt install jmtpfs # Debian/Ubuntu
mkdir -p ~/phone
jmtpfs ~/phone
ls ~/phone
# Unmount when done
fusermount -u ~/phone
MTP over WiFi: Android File Transfer alternatives
If you prefer wireless file copying without installing KDE Connect, apps like LocalSend (cross-platform, open source) or the phone's built-in SMB/FTP server (varies by manufacturer) work well over your local network without any additional Linux daemon.
KDE Connect: Deep Wireless Integration
KDE Connect is a protocol and application suite that pairs your phone and desktop over your local network (no cloud account required). Features include shared clipboard, notification mirroring, remote input, file sending, media control, and running commands on the desktop from the phone.
Install KDE Connect on the desktop
# Debian / Ubuntu 22.04+
sudo apt install kdeconnect
# Fedora 38+
sudo dnf install kde-connect
# Arch Linux
sudo pacman -S kdeconnect
KDE Connect ships its own indicator. On Plasma it integrates into the system tray automatically. On other desktops, start it manually:
/usr/lib/kdeconnectd &
kdeconnect-indicator &
Open firewall ports
KDE Connect uses TCP and UDP ports 1714–1764. You must allow these on the desktop firewall or pairing will fail silently.
# firewalld (Fedora, RHEL family)
sudo firewall-cmd --zone=home --add-service=kdeconnect --permanent
sudo firewall-cmd --reload
# ufw (Ubuntu/Debian default)
sudo ufw allow 1714:1764/tcp
sudo ufw allow 1714:1764/udp
# nftables (manual, for custom setups)
sudo nft add rule inet filter input udp dport 1714-1764 accept
sudo nft add rule inet filter input tcp dport 1714-1764 accept
Install the Android app and pair
Install KDE Connect from F-Droid or Google Play on your Android device. Both phone and desktop must be on the same network segment. Open the app on the phone — your desktop should appear. Tap it, then tap Request Pairing. Accept on the desktop. The connection is encrypted with RSA keys exchanged at pairing time.
Verify and use the connection
kdeconnect-cli --list-devices
Output will look similar to: - Pixel 8 Pro: abc123def456 (paired, reachable). You can then send files from the terminal:
kdeconnect-cli --device abc123def456 --share /path/to/file.pdf
GSConnect: KDE Connect for GNOME
GSConnect is a GNOME Shell extension that reimplements the KDE Connect protocol entirely in JavaScript (GJS). It requires no separate daemon — it runs inside the Shell process. The phone-side app is the same KDE Connect Android app.
Install GSConnect
The cleanest install path is the GNOME Extensions website or the gnome-shell-extension-gsconnect package where available:
# Ubuntu 22.04 / 24.04
sudo apt install gnome-shell-extension-gsconnect
On Fedora or Arch, install via extensions.gnome.org using the browser connector:
# Arch: browser connector
sudo pacman -S gnome-browser-connector
After installing, log out and back in (or run Alt+F2 → r on X11; Wayland requires a full logout). Enable the extension in GNOME Extensions or gnome-extensions-app.
Wayland note
GSConnect works under Wayland but the "remote input" (controlling the desktop from the phone) feature requires the Mutter Remote Desktop portal, available from GNOME 41 / mutter 41+. Confirm with gnome-shell --version. If remote input doesn't work, this is almost always the reason.
Firewall for GSConnect
Same ports as KDE Connect (1714–1764). Apply the same ufw or firewalld rules shown above.
Syncing Calendars and Contacts
KDE Connect and GSConnect handle files and notifications, but calendar and contact sync is a separate concern. The modern approach is CalDAV/CardDAV over a self-hosted or cloud server:
- Nextcloud (self-hosted): Install the Android app, configure CalDAV/CardDAV URLs, and sync with GNOME Online Accounts or KDE's account settings.
- Google account: Add via GNOME Online Accounts (
gnome-control-center online-accounts) or KDE's system settings. Both pull CalDAV/CardDAV natively. - DAVx⁵ (Android app): The most reliable Android CalDAV/CardDAV client; handles self-signed certs and complex server setups cleanly.
There is no equivalent of the old PalmOS single-cable conduit sync for calendars and contacts on Android — network sync has entirely replaced it.
Troubleshooting
MTP: device not detected
If mtp-detect finds nothing, the problem is usually a missing udev rule that prevents non-root access to the USB device. Create a rule:
# Find the vendor/product ID
lsusb | grep -i android
# Example output: Bus 001 Device 007: ID 18d1:4ee2 Google Inc. Nexus/Pixel Device (MTP)
# Add udev rule (replace idVendor and idProduct with your values)
echo 'SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee2", MODE="0660", GROUP="plugdev"' \
| sudo tee /etc/udev/rules.d/51-android.rules
sudo udevadm control --reload-rules
sudo udevadm trigger
Also confirm your user is in the plugdev group: groups $USER. If not: sudo usermod -aG plugdev $USER, then log out and back in.
KDE Connect / GSConnect: devices not discovering each other
- Both devices must be on the same subnet. Guest WiFi networks commonly isolate clients — switch to the main network.
- Check the firewall rules are applied to the correct zone. On firewalld, verify with
sudo firewall-cmd --list-all --zone=home. - Restart the KDE Connect daemon:
systemctl --user restart kdeconnect(Plasma), or toggle the GSConnect extension off and on.
GSConnect not appearing after install
On Wayland you must fully log out and back in — Alt+F2 r does not work. Confirm the extension is enabled: gnome-extensions list --enabled | grep gsconnect.
Frequently asked questions
- Why does my Android phone not appear in Nautilus or Dolphin after plugging in?
- The most common causes are the phone still being in Charging-only USB mode (change it to File Transfer/MTP in the notification shade), or a missing udev rule that blocks non-root access to the USB device. Run mtp-detect as root first to isolate which problem you have.
- Do KDE Connect and GSConnect use the same protocol? Can I mix them?
- Yes. GSConnect is a GNOME Shell reimplementation of the KDE Connect protocol. The Android app works identically with both, and you can pair a single phone to a KDE desktop and a GNOME desktop simultaneously.
- Is KDE Connect traffic encrypted? Do I need a VPN?
- Pairing exchanges RSA keys and all subsequent communication is encrypted with those keys. You do not need a VPN on a trusted home or office LAN, but you should not expose ports 1714–1764 to the internet.
- Can I still use pilot-link to sync a Palm device on a modern distro?
- Technically you can compile pilot-link from source, but it is unmaintained, has not been updated for modern USB stacks, and most Palm devices are no longer reliably detected. For practical purposes, PalmOS sync on modern Linux is a dead end.
- Does MTP work for iPhone?
- No. iPhones use Apple's proprietary AFC protocol, not MTP. Use libimobiledevice and gvfs-afc for basic file access on iOS devices.
Related guides
Linux Clipboards Explained (+ Clipboard Managers)
Learn the difference between Linux's PRIMARY and CLIPBOARD selections, use xclip, xsel, and wl-clipboard from the terminal, and manage history with GPaste or Klipper.
Configure LibreOffice for Daily Use
Configure LibreOffice for daily use: set default save formats for MS Office interop, tune autosave, install fonts, and add productivity extensions.
Configure the Touchpad and Multitouch Gestures
Configure Linux touchpad behavior and multitouch gestures using libinput, libinput-gestures, and native GNOME and KDE Plasma settings on both Wayland and X11.
Wayland vs X11: How to Choose and Configure Each
Know when to run Wayland or X11, how to check your current session, switch at login with GDM/SDDM/LightDM, and handle NVIDIA and XWayland edge cases.