
Replying to a message from the laptop. The reply is sent from the phone.
ecoz is a small pair of apps, one for a Linux laptop and one for an Android phone, that makes the two behave like parts of the same machine, the way a Mac and an iPhone do. It runs on your own network, with no server in the middle and no account to make.
Status: early. I built and tested it on Ubuntu 26.04 (GNOME 50, Wayland) with a Nothing Phone 3a on Android 16. It works well there. Other setups may need fixes, and issues and pull requests are welcome.
- Install the laptop service (one command) and build the Android app.
- Pair them once with a code. The phone pins the laptop's certificate from then on.
- Turn on what you want from the app and from the laptop's settings window.
The laptop runs a small HTTPS service and the phone keeps one connection open to it, so the laptop can push things to the phone at any time. If the laptop's address changes, the phone finds it again by itself.
Phone (Android app) Laptop (Linux service)
┌───────────────────────────────┐ ┌───────────────────────────────┐
│ links, clipboard, files, │ <=== pinned TLS ===> │ HTTPS service │
│ notifications │ over Wi-Fi or hotspot │ pushes events to the phone │
├───────────────────────────────┤ ├───────────────────────────────┤
│ Bluetooth beacon │ ..... Bluetooth LE ....> │ presence scanner │
│ rotates every 30 s │ │ near / mid / away │
├───────────────────────────────┤ ├───────────────v───────────────┤
│ hardware key │ ... signed challenge ...> │ auto-lock and unlock │
│ works only if phone unlocked │ │ checks distance + signature │
└───────────────────────────────┘ └───────────────────────────────┘
- Laptop: Linux with GNOME. Developed on Ubuntu 26.04 (GNOME 50, Wayland). It needs Python 3, PyGObject,
python3-cryptography(for unlock), OpenSSL, Avahi and BlueZ. - Phone: Android 10 or newer. Developed on Android 16.
- Network: both on the same Wi-Fi, or the laptop on the phone's hotspot. Bluetooth is only used for lock and unlock.
# Debian / Ubuntu package names; adapt for your distro
sudo apt install python3-gi python3-cryptography gir1.2-adw-1 gir1.2-gtk-4.0 \
openssl avahi-daemon libnotify-bin xdg-utils
git clone https://github.com/dakshhpanchal/ecoz.git
cd ecoz
./install.shinstall.sh needs no root. It links the ecoz command, starts a systemd user service, and adds a settings launcher and the Send to Phone entry in Files. Keep the folder where it is.
For the shared clipboard, install the GSConnect GNOME extension and enable it. ecoz only uses its clipboard bridge, so nothing needs to be paired with KDE Connect. On GNOME 50 use v74 or newer; older versions hang on it. Without GSConnect, everything else still works.
Building needs JDK 17 or newer and the Android SDK (platform 37). Turn on USB debugging to install.
cd android
./gradlew assembleDebug
adb install -r app/build/outputs/apk/debug/app-debug.apkecoz pairA window shows a QR code. In the app tap Scan QR code and point the camera at it, then tap Test connection. The terminal also prints the code, which you can paste into the app instead if the camera isn't an option.
The code contains a secret. Do not post it anywhere public.
In the app, switch on Receive from laptop, and then whichever of Mirror notifications, Tell the laptop when I'm close, Let my phone unlock the laptop, Texts on the laptop, Calls on the laptop and Hotspot for the laptop you want. You can also add the ecoz tile to the phone's Quick Settings to turn it on and off. On the laptop, open ecoz from the app grid (or run ecoz settings).
Try it: share a link from Chrome to Send to laptop, copy some text on the laptop and paste it on the phone, or run ecoz ring.
| Command | What it does |
|---|---|
ecoz send <link or text> |
Push it to the phone. With no argument, sends your clipboard. |
ecoz send-file a.jpg b.pdf |
Offer files to the phone. It asks first, unless you turned that off there. |
ecoz ring / ecoz ring stop |
Find my phone. |
ecoz settings |
The settings window. |
ecoz call <number> |
Dial from the phone. |
ecoz answer, ecoz decline, ecoz hangup |
Control the phone's current call. The same buttons appear on the incoming call notification. |
ecoz audio [connect] |
Hear calls on the laptop: connects the phone's hands-free audio over Bluetooth, once the two are paired. |
ecoz sms |
Read and answer your phone's texts in a window (switch it on in the app first). |
ecoz hotspot [on|off|test] |
When the laptop has no internet and the phone is close, make the phone offer its hotspot switch. test pretends to be offline for a minute. |
ecoz confirm [on|off] |
Ask before accepting files from the phone (default on). |
ecoz sync [on|off] |
Share the clipboard with the phone. |
ecoz proximity [on|off], ecoz presence |
Listen for the phone's beacon, and show near, mid or away with the signal strength. |
ecoz autolock [on|off] |
Lock when the phone walks away (default off). |
ecoz unlock [on|off|forget|status] |
Unlock from the phone (default off). |
ecoz pair |
Show a QR code for the phone to scan (the code is also printed, to paste instead). |
- Encryption and identity. Every connection is TLS. The phone pins the laptop's certificate fingerprint when you pair, and the laptop checks a secret token, so a stranger on your Wi-Fi cannot talk to either side.
- Nothing leaves your network. No server, no account, no analytics. The phone app only talks to your laptop.
- Files. Both directions ask first, before any data moves. Names are reduced to a plain file name, files are written under a temporary name and renamed when complete, and an upload must match what was approved.
- The beacon. A tag only your laptop can recognise, changing every 30 seconds, carrying no name or location.
- Unlock. It needs the phone near, the phone unlocked, a fresh signed challenge (single use, tied to your laptop, valid for 15 seconds) and someone touching the laptop. The key is created in the phone's secure hardware and cannot be copied out. Registering a phone needs an Accept on the unlocked laptop.
Unlock does lower your laptop's protection, so know the limits:
- Someone who can relay your phone's Bluetooth beacon and get your unlocked phone to answer could unlock it.
- Anyone who touches the laptop while you stand next to it with an unlocked phone will find it unlocked. Apple's Auto Unlock with a watch works the same way.
- A phone in your pocket is normally locked, so unlock only works while the phone is unlocked. Android's Extend Unlock keeps it unlocked while you carry it.
The exact rules are in daemon/ecoz_unlock.py.
ecoz does not replace the mature tools. It aims at one thing: the feel of Apple's Continuity between one phone and one laptop.
| ecoz | KDE Connect / GSConnect | LocalSend | |
|---|---|---|---|
| Aim | One phone and one laptop, seamless | Many devices, many plugins | Send files to anyone nearby |
| Lock and unlock with the phone | yes | not that I know of | no |
| Ask before accepting files, per device | yes | not that I know of | no |
| Notification replies | yes | yes | no |
| SMS | plain SMS only, no RCS | yes | no |
| Calls | controls, audio over Bluetooth | yes | no |
| Media control, remote input | not yet | yes | no |
| Other desktops (KDE, Windows, macOS) | GNOME only for now | yes | yes |
| Maturity | early | many years | many years |
If you want a proven toolbox, use KDE Connect. If you want the unlock and the one-machine feel, try ecoz.
- GNOME only for now. The clipboard bridge, locking and idle detection use GNOME. Links, files, notifications and find-my-phone should not depend on it, but I have only tested on GNOME.
- You build the phone app yourself. There is no Play Store or F-Droid release yet.
- Phone to laptop clipboard needs one tap. Android stops background apps from reading the clipboard. I tried the known workarounds on an Android 16 phone and they do not work there.
- Texts are plain SMS only. RCS chats ("Chat features") cannot be read by any app, though you can reply to their notifications. Texts you send from the laptop do not show up in the Messages app, because only the default messaging app may write there. Bank and login codes will be visible on the laptop, so leave this off on a shared computer.
- Calls: controls, not audio. The laptop shows who is calling and can answer, decline, hang up and dial. Android does not let apps carry call audio, so hearing the call on the laptop needs the phone paired with it over Bluetooth as a headset (
ecoz audio). That depends on your laptop's Bluetooth and audio setup, and call quality is phone-call grade. - The hotspot is one tap, not zero. Android does not let apps switch it on, so the phone shows a notification that opens the switch.
- Unlock only works on a locked screen. At the login screen (after a shutdown or a logout) you still type your password, because no ecoz service is running before you log in.
- Folders cannot be sent yet, only files.
- Tested on one setup.
- Links, clipboard, notifications with replies, find my phone
- File transfer both ways, asking first on each device
- Auto-lock and unlock with a hardware-backed key
- One-tap hotspot when the laptop is near and offline
- QR-code pairing
- SMS in a laptop window, and a Quick Settings tile to switch ecoz on and off
- Phone calls on the laptop (notification, answer, decline, dial; audio over Bluetooth)
- Send folders
- Release builds: signed APK, F-Droid,
.deb - KDE Plasma and other desktops, X11
- Browser-tab hand-off, several phones, media controls
Have an idea? Open an issue.
Does it need root?
No, neither on the laptop nor on the phone.
Does it work over the internet?
No, by design. Both devices must be on the same Wi-Fi, or the laptop on the phone's hotspot. That also keeps it fast.
Transfers are slow.
Check the Wi-Fi band. On a 2.4 GHz hotspot I measured about 7 MB/s and on 5 GHz about 50 MB/s. Set the phone's hotspot to 5 GHz.
The phone notification says "Connecting" and never connects.
Check the laptop service with systemctl --user status ecoz, make sure both are on the same network, and set the app's battery setting to Unrestricted so Android does not kill the connection.
How do I uninstall it?
systemctl --user disable --now ecoz
rm ~/.local/bin/ecoz ~/.config/systemd/user/ecoz.service \
~/.local/share/applications/ecoz.desktop "$HOME/.local/share/nautilus/scripts/Send to Phone"
rm -r ~/.config/ecoz # your certificate, token and settingsThen uninstall the app from the phone.
Bug reports, ideas and pull requests are welcome. Good first things to pick up: folder sending, KDE Plasma support, packaging, and tests.
daemon/ the laptop side (Python). ecoz_daemon.py is the service and the CLI;
ecoz_presence, ecoz_lock and ecoz_unlock handle proximity;
ecoz_reply and ecoz_settings are the GTK 4 and libadwaita windows
android/ the phone app (Kotlin, Jetpack Compose, Material 3)
integrations/ the Files right-click script and the app-grid launcher
Run the service from source with python3 -I daemon/ecoz_daemon.py serve. If you open a pull request, please try the part you changed on a real device, since most bugs here only show up on real hardware.
MIT © 2026 Daksh Panchal
GSConnect and KDE Connect, whose clipboard bridge ecoz uses on GNOME and which showed what a phone and laptop link can be. LocalSend, for the standard of how simple local file sharing should feel.






