Skip to content

Medformatik/CrossDrop

Repository files navigation

CrossDrop

Important

This repository is back in an experimental continuation state on main. Google has announced official compatibility between Quick Share and AirDrop, so this project may no longer be necessary for everyday use, but the codebase remains available.

CrossDrop is a partial implementation of Google's Quick Share in Flutter for macOS, iOS and Linux. The app lives in your menu bar and saves files to your downloads folder.

CrossDrop is based on NearDrop, a Swift implementation of Nearby Share for macOS. Protocol documentation is available in the NearDrop repository.

Features

  • Send and receive files to/from Android (Quick Share) and other CrossDrop devices, with a PIN confirmation and QR-code pairing for hidden/contacts-only senders.
  • Send text and links — type or paste content and beam it to a nearby device.
  • Receive text, links, and Wi-Fi credentials — surfaced in the app with copy / open actions instead of being auto-opened.
  • Visibility modesEveryone, Hidden, or Visible for 1 minute (auto-reverts), controllable from the menu-bar tray and the settings panel.
  • Wake from hidden — while Hidden, CrossDrop scans (via Bluetooth LE) for the beacon a nearby device emits when it starts sharing, then briefly makes itself discoverable and notifies you. Stay private by default, reachable on demand. (macOS, Linux, iOS.)
  • Configurable download folder, launch at login (macOS/Linux), light/dark/system theme, and an in-app update check.
  • macOS share integration via the system Services menu: Send with CrossDrop (files) and Send text with CrossDrop (selected text).

Screenshots

Receiving Sending Settings
CrossDrop menu-bar popover, ready to receive files CrossDrop sending a file, showing a QR code to scan from Quick Share CrossDrop settings: device name, visibility, download folder, launch at login, appearance, and updates

Installing

Grab the latest build from the Releases page.

Note

I'm currently in the process of joining the Apple Developer Program so that CrossDrop can be released for macOS (signed and notarized), and possibly later for iOS/iPadOS as well.

macOS

  • Homebrew (once published to the tap):

    brew install --cask Medformatik/tap/crossdrop
  • Manual: download CrossDrop-<version>-macos-universal.zip, unzip, and move CrossDrop.app to /Applications.

Published release builds are signed with a Developer ID and notarized by Apple, so Gatekeeper opens them without warnings. Locally built (unsigned) apps require a right-click → Open, or xattr -dr com.apple.quarantine CrossDrop.app.

Linux

  • AppImage: download CrossDrop-<version>-linux-x86_64.AppImage, then chmod +x it and run.
  • Tarball: download CrossDrop-<version>-linux-x64.tar.gz, extract it, and run ./CrossDrop.

iOS

No public distribution yet — build and run from source (see below).

Building from source

Requires the Flutter SDK 3.44.2 or newer.

git clone https://github.com/Medformatik/CrossDrop.git
cd CrossDrop
flutter pub get

Run in development:

flutter run -d macos   # or: -d linux

Build release binaries:

flutter build macos --release    # → build/macos/Build/Products/Release/CrossDrop.app
flutter build linux --release    # → build/linux/x64/release/bundle/
flutter build ios --release      # requires an Apple Developer account for signing

On Linux, install the build toolchain first:

sudo apt-get install -y clang cmake ninja-build pkg-config libgtk-3-dev liblzma-dev

Limitations

  • LAN only. Your Android device and your Mac need to be on the same network for this app to work. Google's implementation supports multiple mediums, including Wi-Fi Direct, Wi-Fi hotspot, Bluetooth, some kind of 5G peer-to-peer connection, and even a WebRTC-based protocol that goes over the internet through Google servers. Wi-Fi direct isn't supported on macOS (Apple has their own, incompatible, AWDL thing, used in AirDrop). Bluetooth needs further reverse engineering.
  • Visibility is LAN-based. CrossDrop advertises over mDNS while Everyone or Visible for 1 minute is selected, and stops advertising while Hidden. While Hidden it still listens for the BLE "device nearby is sharing" beacon to wake on demand, but it can't advertise that beacon itself (Apple platforms forbid custom BLE service-data advertising), so it can't trigger Android's own "device nearby is sharing" notification. Google's account-based Contacts visibility requires talking to Google servers.

Contributing

Contributions are welcome! Please open an issue or a pull request.

CI (.github/workflows/ci.yml) formats, analyzes, and tests on every push and pull request, then compiles the macOS, Linux, and iOS apps. Pushing a v* tag triggers .github/workflows/release.yml, which builds a signed + notarized macOS app and packaged Linux artifacts (AppImage + tarball) and attaches them to a GitHub Release.

FAQ

Why does this exist next to NearDrop?

NearDrop is a Swift implementation of Nearby Share for macOS. It therefore only works on macOS. CrossDrop is a Flutter implementation of Nearby Share. It serves the same purpose, but works on more platforms. This way, Nearby Share can also be used on Linux and iOS.

Why not the other way around, i.e. AirDrop on Android?

While I am an Android developer, and I have looked into this, this is nigh-impossible. AirDrop uses AWDL, Apple's own proprietary take on peer-to-peer Wi-Fi. This works on top of 802.11 itself, the low-level Wi-Fi protocol, and thus can not be implemented without messing around with the Wi-Fi adapter drivers and raw packets and all that. It might be possible on Android, but it would at the very least require root and possibly a custom kernel. There is an open-source implementation of AWDL and AirDrop for Linux.

About

CrossDrop is a partial implementation of Google's Quick Share in Flutter for macOS, iOS and Linux. CrossDrop is based on NearDrop, a Swift implementation of Quick Share for macOS.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Contributors