Send anything to anyone nearby. No Google required.

Tarish is file sharing for de‑Googled Android that works with AirDrop and Quick Share. Send a file to a MacBook from a phone that has never spoken to Google: the Mac shows a real device name and a normal AirDrop prompt. Send to a Windows laptop or another Android phone and Quick Share does the same. Nothing signs in, nothing checks in, and no Google application is installed.

  • Verified on hardware
  • SELinux enforcing
  • Zero Google applications installed

01 — What works

Both protocols, both directions, with and without a network

Tested against real peers, not only against itself: macOS and iOS for AirDrop, Windows 11 and stock Android for Quick Share. Passing against one vendor proves very little, and that distinction has caught bugs no amount of self‑testing would.

AirDrop AppleQuick Share Android, Windows
DiscoveryAWDL and mDNSmDNS on Wi‑Fi, Bluetooth LE off‑network
SendWorksWorks
ReceiveWorksWorks
Shared networkWorks22 MB/s measured
No shared networkAWDL is its own linkWi‑Fi Direct 10.5 MB/s; Bluetooth ~150 KB/s to start
Both at onceOn BCM4390 devices, concurrently and in opposite directions. Not on BCM4383 — see Devices.

02 — Why

Sandboxed Play Services is not an answer to this

It cannot do AirDrop at all. Google’s AirDrop support needs its mosey stack running with platform privileges. Getting it working that way needed privileged Play Services, not the sandboxed kind, plus a successful check‑in to Google’s servers to receive a feature flag. That is a long way from installing an app.

And for many people the objection is the code, not the sandbox. Sandboxed Play Services is still Google’s code on your device. Plenty of people who choose a de‑Googled OS do not want it there at any privilege level. That is a legitimate position, and it should not cost you file sharing with the people around you.

03 — How it works

Two processes, and the split is not arbitrary

The daemon holds the link and speaks the protocols

A native daemon has no foreground‑service requirement, so there is no permanent notification, and doze and app standby do not apply to it. It keeps AWDL up, answers mDNS, terminates TLS and runs both protocol state machines. The part that parses input from strangers runs as its own unprivileged uid and holds nothing else.

tarishd · tarishsharingd · libtarish_protocol

The app does what only the framework can, and owns consent

Bluetooth LE, Wi‑Fi Direct groups and the share sheet are framework API a native daemon cannot reach; the app creates them and hands the daemon a file descriptor. It is where a person says yes or no, and where managed policy is read. It holds no protocol state.

share sheet · prompts · inbox · policy

What is ours and what is the vendor’s

Quick Share is ours top to bottom. For AirDrop, the radio and the AWDL protocol come from two vendor files that already ship in the Pixel vendor image and run on a build with no Google packages — using them adds nothing that was not already on the device. Replacing them is a separate track that has not started.

AirDrop layerWhoseNotes
Radio and MACVendorwonder.ko, already in the stock image. No AWDL protocol in it
AWDL protocolVendorlibmosey_daemon_ffi.so — election, sync, peer discovery
IP on mosey0Oursincluding the routing Android’s fwmark model requires
mDNS, TLS, HTTP, plist, cpioOurstarishsharingd
Share sheet, prompts, consentOursthe app

libtarish_protocol — UKEY2, D2D keys, SecureMessage, the secure channel and the sharing state machines — is deliberately Android‑free so it tests on a build host: 202 tests, including a whole share between two peers in‑process, compared byte for byte.

04 — Devices

It depends on the Wi‑Fi chip, not the model

Tarish needs wonder.ko bound to the Wi‑Fi driver. Every Pixel 10 image ships drivers for both chips and loads whichever matches the silicon, so the model name tells you nothing. Check the device itself:

adb shell 'lsmod | grep bcmdhd'        # 4390 = good, 4383 = no wondertap
adb shell 'ls /sys/class/ieee80211/'   # a `wonder` wiphy is the real test
DeviceChipAirDropQuick Share
Pixel 10 Pro blazerBCM4390AWDL and Wi‑Fi coexistWorks
Pixel 10 Pro XL mustangBCM4390AWDL and Wi‑Fi coexistWorks
Pixel 10 frankelBCM4383Works, but takes the radioWorks
Pixel 10 Pro Fold rangounverifiedunverifiedexpected to work
Pixel 10a stallionno wonder.koNot possibleWorks

On BCM4383 the radio is exclusive

With no wondertap, AWDL falls back to a path that takes the physical radio: Wi‑Fi drops within about ten seconds of AirDrop becoming active and returns on its own 10–24 seconds after it is switched off. Stock Android behaves the same on this hardware. Nothing needs a reboot, but AirDrop and Quick Share over Wi‑Fi are mutually exclusive there. For a daily driver, prefer a BCM4390 device.

Transfers to Apple are slower, and that is the protocol

An iPhone keeps a sparse AWDL presence to save power — available in 4 of 16 windows where our devices are in 16 of 16. Device to device runs 7.7–9.1 MB/s; iPhone to device 2.6–4.7 MB/s.

05 — Design positions

These look odd until you know why

Visible only on the Receive screen

Anything else means a phone quietly discoverable in a bag. The screen is held awake while it advertises, so the device never goes off the air while still reporting itself available.

The daemon decides; the app asks

Consent is enforced where the bytes move, not in the UI, so an app that hides its send button cannot be bypassed by calling the interface directly.

Managed policy is honoured

A pinned control is shown disabled and labelled rather than hidden. A control that silently refuses to move reads as a broken app, not as an enforced policy.

The parser has its own uid

That costs a one‑line framework patch: since Android B only uid 0 and 1000 may touch the local network by default, and a native daemon can never earn the permission any other way.

06 — For OS builders

Built to be adopted

Tarish is part of the operating system, not an app from a store: a daemon with its own SELinux domain and a privileged app. The integration guide is written for someone who has never seen the project.

  • No Google dependency and no network callbacks
  • An unprivileged parser process
  • Policy an administrator can pin
  • Apache 2.0 — a licence that imposes nothing
  • Nothing GrapheneOS‑specific by design: the daemon asks the platform for an AWDL library and a kernel module and does not care where they came from

LineageOS is the next target. If you maintain GrapheneOS, LineageOS or another AOSP build and want this in the image, please open an issue.

07 — Open issues

What is still broken

The project keeps its open work in TODO.md, which leads with what does not work rather than with what does.

  • Sending to a Mac does not always find it. Receiving is reliable; the discovery half of sending is under investigation.
  • AWDL uses channel 149 only. That channel is not permitted for Wi‑Fi in much of the EU, where AirDrop will refuse to start until the channel follows the regulatory domain.
  • On BCM4383, AirDrop takes the radio. A property of the chip; the app should say so plainly while it happens.

08 — Credits

Prior work this benefited from

Bada

An open Quick Share implementation for Android. No code from it is used — this is a fresh implementation in another language and process model — but it worked out protocol details and wrote down why they matter.

OWL and OpenDrop

The Open Wireless Link research on AWDL, and OpenDrop, established what AirDrop looks like on the wire.

Full credits

Where a constant exists because someone else found it first, the comment beside it in the source says so.