Unofficial, community project. Not affiliated with or endorsed by Lovense. LOVENSE is a trademark of its owner.
Lovense, Satisfyer, We-Vibe, Svakom, Lelo, Kiiroo, Magic Motion, JoyHub, Hismith, Vorze… controlled straight from your Android phone over Bluetooth — no vendor app, no account, no cloud.
English · Français
⬇️ Download the APK · 🧸 Is my toy supported?
🌐 Website & toy search · ⭐ Useful? Star the repo — it's how other people find it.
- One app instead of ten. Stop installing a different app (and creating a different account) for every brand: this app speaks the Bluetooth protocol of 803 toy models from 127 brand families.
- Several toys at the same time. Connect up to 5 toys — even from different brands — and drive them one by one or all together.
- The screen adapts to your toy. A vibrator gets a vibration slider, a rotating toy gets a direction button, a heated toy gets a heat switch, a stroker gets a speed control… you only see what your toy can do.
- Private by design. Everything stays on your phone. No sign-up, no tracking, no Google services. Sharing with a partner is optional and locked behind a PIN and your approval.
The full, searchable list (model by model, with each toy's functions) is in
docs/SUPPORTED_TOYS.md. The biggest families:
| Brand | Models | Brand | Models | |
|---|---|---|---|---|
| JoyHub | 159 | Sexverse | 22 | |
| Galaku | 97 | Honey Play Box | 21 | |
| Satisfyer | 84 | Hismith | 20 | |
| Svakom | 51 | Lelo | 15 | |
| Lovense ✅ | 36 | Libo | 14 | |
| Kiiroo | 31 | Sistalk MonsterPub | 13 | |
| Magic Motion | 29 | Sensee | 12 | |
| Foreo | 26 | Love Distance | 9 | |
| We-Vibe | 23 | MysteryVibe · Vorze | 8 · 7 |
…plus Vibio, VibCrafter, Fluffer, Motorbunny, OSSM, Lioness, Aneros, Je Joue, Lovehoney, Picobong, Pink Punch, Amorelie, Adrien Lastic, F-Machine, Nexus, Utimi, Zalo, TryFun, Umove and ~80 more.
What those toys can do in the app:
| Function | Toys | How you control it |
|---|---|---|
| 📳 Vibration | 743 | Slider per motor; one-thumb XY pad for two-motor toys |
| 🔄 Rotation | 59 | Slider + direction flip button |
| 130 | Speed slider | |
| 💨 Suction / pump | 51 | Level slider |
| 🔥 Heating | 21 | On/off switch, or a temperature slider in °C |
| 🎚️ Strokers | 19 | Speed slider — the app generates the strokes |
| 💡 Lights | 2 | On/off switch or brightness |
| 💧 Lube pump | 2 | Spray button |
| 🔋 Battery | 200+ | Shown next to the toy's name |
✅ Tested vs 🧪 experimental. Lovense is tested on real hardware. Every other brand uses protocols reverse‑engineered by the Buttplug community and is marked experimental in the app: it should work, but hasn't been checked on a real toy by this project. Reports (it works / it doesn't) are very welcome in the issues!
🚫 Not supported yet: The Handy, KGoal Boost, Muse, Cueme, SayberX, Kiiroo V1, Libo Karen, Twerking Butt. They show up greyed out in the scan.
- Install the APK from the latest release (Android 8.0+).
- Turn your toy on — and make sure its official app is closed, since a toy only accepts one connection at a time.
- Open the app. It searches for nearby toys on its own; yours appears with its brand and model name. Tap it to connect (tap others to add more toys).
- Play. Use the sliders, the XY pad, presets or patterns. STOP ALL (also available as a quick-settings tile) stops everything instantly.
A few toys need an extra pairing step, and the app tells you when: press the power button on Lelo toys, enter PIN 6496 on Lioness.
| 🔵 Direct Bluetooth | Scan, connect and control from your phone; automatic reconnection. |
| 🧸 Multi-toy | Up to 5 toys at once, mixed brands; drive one or all. |
| 🎚 Adaptive controls | One control per function of the toy (see table above). |
| 👍 One-hand XY pad | One thumb drives both motors of two-motor toys. |
| 🎛 Patterns | Built-in patterns, Lovense .ta import, random Tease mode, record mode (play → save as a pattern). |
| 🔗 Remote control by link | A partner controls your toys from the same Wi-Fi or over the internet / 4G (see below). |
| 🌙 Background | Keeps working with the app closed; quick-settings STOP tile. |
| 🌍 Languages & themes | English / French / Spanish, dark & light. |
| 🟢 100 % AOSP | No Google Play Services — works on GrapheneOS, LineageOS… |
- Tap Share: you get a Same Wi-Fi link. The Internet link is optional: it is only created after you accept that traffic goes through the third-party relay localhost.run.
- Send the link to your partner, and tell them the 6-digit PIN separately.
- When they open it, you approve them on your phone. Only then can they drive your toys, from any browser — no app needed on their side.
- Stop sharing whenever you want; it also expires on its own after 30 minutes. When control stops (share stopped or expired, controller gone or kicked, STOP tile), your toys are stopped too.
Read the full privacy policy.
Knowing the link is never enough to control your toys:
- Secret link — 128-bit random id, new on every share; old links die at once.
- 6-digit PIN — never in the URL, checked in constant time; 5 wrong codes stop the share.
- Your approval, per person — you accept (or kick) each controller individually.
- Hardened web page — strict CSP, anti-framing,
Origincheck against cross-site WebSocket hijacking, small frames, rate limiting, max 3 sockets, 10 s to authenticate. - Minimal network surface — listens only on 127.0.0.1 and the Wi-Fi IP, never on mobile data / VPN interfaces.
- Pinned relay key — nobody can impersonate the internet relay.
- No backups of app data; deep links are validated and need your OK.
- Discreet — screenshots blocked, hidden in Recents, neutral notification on the lock screen.
Limits you should know: same-Wi-Fi sharing is plain HTTP (use a Wi-Fi you trust). Internet sharing goes through localhost.run, a third party that can see the control traffic — the PIN and your approval remain the gate. If you use a firewall app, allow network access for this app or sharing can't start.
My toy isn't in the scan.
Make sure it's switched on, not connected to its official app or another phone, and that Bluetooth and location/nearby-devices permissions are granted. Then check the list: if it's not there, open an issue with the name the toy shows in a BLE scanner app.
What does "experimental" mean? Can it damage my toy?
It means the commands come from community documentation and haven't been tried on that model by this project. The app only sends the same kind of commands the official apps send, and only to the channels that model is known to use.
Why is it called "Lovense Remote" if it supports other brands?
It started as a Lovense-only remote; multi-brand support came later. It is not affiliated with, endorsed by or sponsored by Lovense or any other brand; brand names are only used to say which toys are compatible.
TODO (maintainer): the app name reuses the name of Lovense's official app. A rename (e.g. "Edge2 Remote", matching the package id) is planned but not decided yet; it would touch the app label, store listings, F-Droid metadata and the repository name.
ANDROID_HOME=~/Android/Sdk ./gradlew :app:assembleDebug # build
./gradlew :app:testDebugUnitTest # unit testsKotlin + Jetpack Compose · minSdk 26 · target/compile SDK 35. See CONTRIBUTING.md, CHANGELOG.md and SECURITY.md.
🧩 Architecture
ble/— scan and identification (ToyManager), oneToyConnectionper toy (GATT with named endpoints, serialized operations, coalesced writes, keepalive, stroke generator, battery, reconnection).ble/db/— the device database (assets/devices.json, generated from the Buttplug device config bytools/gen_devices.py).ble/proto/— oneProtocolHandlerper protocol (~128), ported from Buttplug: handshakes, encryption, checksums, per-function commands. Seedocs/research/other-brands.mdanddocs/research/lovense-ble-protocol.md.RemoteEngine— process-wide core (BLE + server + tunnel + state), so control survives the app being closed.remote/— embedded HTTP + WebSocket server, web control page, internet tunnel (SshTunnel).
Regenerate the supported-toys list after updating the database:
python3 tools/gen_supported.py.
GPLv3. Not affiliated with, or endorsed by, Lovense or any other brand listed here.
The device database and protocol implementations come from
Buttplug (BSD-3-Clause, © Nonpolynomial
Labs) — see THIRD_PARTY_NOTICES.md. Huge thanks to
the Buttplug / Intiface community for years of reverse engineering.
🤖 Vibe coded — this app was largely written with an AI coding assistant, then reviewed and tested by hand. Read the code (and the security section) before trusting it with anything that matters.


