Inspiration

Sharing a file should not become harder because one person has an Android phone and the other has an iPhone. Existing flows often depend on a cloud upload, a shared account, the same ecosystem or a list of vaguely “nearby” devices. Droplet asks for a simpler human action: open it on both phones, bring them close and verify that both screens show the same code.

What it does

Droplet discovers a nearby Android phone or iPhone over Bluetooth, starts its connection experience as the phones come close and asks both people to confirm a six-digit code. It then forms a direct local Wi-Fi route and transfers only the files the receiving person accepts.

Both phones can offer files at the same time. A receiver can accept everything, reject the offer or select individual files, then save one result or save them all. Transfer progress, cancellation and local history remain visible. Selected file contents do not pass through a Droplet cloud server.

Free users can send up to 5 files or 100 MB in one transfer. Droplet Pro, powered by RevenueCat, raises that to 20 files or 1 GB with weekly and yearly store-localized plans.

How we built it

Droplet uses Kotlin Multiplatform and Compose Multiplatform as the product foundation for both Android and iOS. The shared module owns the navigation, onboarding, paywall, home and transfer UI; the connection and transfer state machines; simultaneous two-way transfer orchestration; authenticated encryption; selection policy; local history contracts; purchase state; and almost all motion and interaction design.

The current shared module contains 7,159 lines across 57 commonMain Kotlin files. Its Android/iOS Kotlin adapter source sets contain 1,365 lines across 14 files. Native adapters stay at the platform boundary: Android Bluetooth, temporary network hosting, foreground execution and storage; iOS CoreBluetooth, Network.framework, Hotspot Configuration, file presentation and lifecycle integration. RevenueCat's Kotlin Multiplatform SDK supplies the same pro entitlement and localized offering model on both platforms.

Challenges

The hardest part was making proximity feel immediate while keeping the connection safe and cross-platform. Bluetooth signal strength is noisy, iOS and Android expose different discovery roles, and the high-speed link requires platform-specific Wi-Fi behavior. We separated visual arrival from network completion, kept explicit code verification, calibrated close-range behavior on a Pixel 6a and iPhone XR and built reconnect/disconnect handling around a shared state machine.

The second challenge was performance. Droplet's water surfaces, transformations, haptics and bidirectional transfer visualization had to remain smooth on an iPhone XR. We reduced avoidable recomposition and allocation, cached expensive visual work and kept file I/O and cryptography away from the UI dispatcher.

Accomplishments

  • A real encrypted file crossed from Android to iPhone and back through the same product flow
  • Either phone can send while the other is already sending
  • The receiver controls each accepted file and can save separately or together
  • Active Android transfers remain perceptible and cancellable through a connected-device foreground service
  • One shared Compose experience preserves the same water, motion, haptics and state transitions on both platforms
  • RevenueCat drives live store products, restore state and one cross-platform Pro entitlement without hard-coded customer prices

What we learned

Cross-platform quality comes from sharing product behavior while respecting native system boundaries. Compose Multiplatform gave us one precise interaction system; small native adapters gave Bluetooth, local networking, storage, billing and background execution the platform control they require.

What's next

The launch build focuses on reliable phone-to-phone sharing. After release evidence and store review, the next work is transfer resumption, a broader device test matrix and carefully evaluated desktop support without weakening the simple nearby flow.

Built With

  • android-bluetooth
  • android-wi-fi
  • compose-multiplatform
  • corebluetooth
  • datastore
  • koin
  • kotlin
  • kotlin-coroutines
  • kotlin-multiplatform
  • network.framework
  • revenuecat
  • room
  • swift
  • swiftui
Share this project:

Updates