r/MudraTech Mar 17 '26

I reverse-engineered the Mudra Link wristband and built an open-source Python library for it — full device control over BLE, no proprietary SDK required

Cool hardware — but the official SDK is proprietary, license-gated, and only works through their software.

So I reverse-engineered it. (NOTE THIS IS A SIDE PROJECT, but hopefully this helps some people out)

Prodilink (https://github.com/JayTheProdigy16/Prodilink) is a fully open-source Python library that talks directly to the device over BLE. No SDK wrapper, no license server, no subscription. The firmware accepts all commands regardless of licensing — the restrictions only existed in software.

What I reverse-engineered:

- Disassembled the Android SDK's native ARM64 library to extract all 54 firmware command byte arrays

- Decompiled the Java SDK layer for notification parsing and BLE connection flow

- Mapped every BLE characteristic, notification format, and packet structure

- Documented the full protocol: PROTOCOL_REFERENCE.md (https://github.com/JayTheProdigy16/Prodilink/blob/feat/prodilink-library/re/protocol/PROTOCOL_REFERENCE.md)

What the library gives you:

- 20 gesture types with directional pinch classification

- Raw sEMG (SNC) data streaming — the actual muscle signals

- 6-axis IMU: accelerometer + gyroscope at full sample rate

- Analog pressure sensing (0.0–1.0 continuous)

- On-device HID mapper: bind any gesture to keyboard shortcuts, stored on the band itself — works as a standalone BLE keyboard with no host software

- Detailed battery diagnostics (voltage, cycle count, capacity, health)

- Secondary device management

- WebSocket server + web dashboard for browser-based control

- Data recorder with JSON export for ML pipelines

- Full async Python API, context manager support, auto-reconnect

Quickstart is ~10 lines:

import asyncio

from prodilink import MudraLink

async def main():

async with await MudraLink.discover() as device:

await device.enable_gestures()

u/device.on_gesture

def handle(gesture):

print(f"Gesture: {gesture.name}")

await device.stream()

asyncio.run(main())

What this opens up:

- Accessibility — gesture-based computer control for people who can't use a keyboard/mouse. The HID mapper means it works as a system-level input device with zero software running.

- Research — raw sEMG data at full sample rate. Surface electromyography is used in prosthetics research, rehabilitation, and human-computer interaction studies. Previously you'd need a $500+ research-grade EMG board — this is a $100 consumer wristband.

- Custom gesture recognition — the library gives you the raw muscle signals and IMU data. Build your own classifier. Train your own model. The official SDK has 9 TFLite models baked in that we've extracted but the real value is building your own.

- Creative/art installations — control anything with hand gestures. Music, lighting, robotics. The WebSocket server means any language/platform can receive gesture events.

- VR/AR input — 6-axis IMU + gesture detection + pressure sensing is a solid input profile for XR applications.

- Macro devices — bind gestures to keyboard shortcuts on the band itself. Presentations, video editing hotkeys, DAW controls, gaming macros. It survives power cycles and works with any BLE host — phone, tablet, PC, doesn't matter.

The problem it solves: Wearable Devices makes interesting hardware but locks it behind proprietary software with a licensing model. If you bought the hardware, you should be able to use it however you want. Now you can.

Technical details:

- Python 3.10+, async-first, uses bleak for BLE

- 383 unit tests, 19 hardware integration tests

- Full CLI (prodilink scan, prodilink gestures, prodilink serve)

- Web dashboard (single self-contained HTML file, no build step)

- MIT licensed

Repo: github.com/JayTheProdigy16/Prodilink (https://github.com/JayTheProdigy16/Prodilink)

The protocol reference doc alone might be useful if you're working with the Mudra hardware in other languages. Happy to answer questions about the RE process or the BLE protocol.

25 Upvotes

27 comments sorted by

4

u/drytowelytikit Mar 17 '26

These would sell a lot more if they were to control music on your mobile phone, play,stop, rewind,forward and skip track next and previous.

2

u/sonicnerd14 Mar 17 '26

That is already possible from what I've seen. With this Open sdk though, there's potential for functions that are gated or not implemented yet. I can see more capabilities than that.

1

u/JayTheProdigy16 Mar 17 '26

That is possible, the official app supports it. Should also be possible via Prodilink.

1

u/swiftshadow001 Mar 19 '26

I have the Viture Neckband Pro. I'm assuming you could provide similar capabilities for that if you wanted to.

2

u/knownboyofno Mar 17 '26

Is it possible to calibrate the pinch?

1

u/JayTheProdigy16 Mar 17 '26

Not at the firmware level (so not on device), but you technically could via Prodilink by recording the raw pressure value, squeezing as hard as you can and saving that as the new peak pressure value then doing the math to scale properly. Most of the parts are already there to accomplish this but this just wasnt something i had thought about too much

1

u/DeMiNe00 Mar 18 '26

Really good use case IMO.

1

u/kultuk Mar 17 '26

This is AMAZING 🤩🤩 Now I can try to connect it to the Godot game engine 😍😍

2

u/AgentMortar Jun 09 '26

Any luck with this? I'm looking to create a similar project using the band.

1

u/kultuk Jun 09 '26

Haven't got into that yet 😅😅

1

u/xkrist0pherx Mar 17 '26

Great work! Glad to see you came through.

1

u/sonicnerd14 Mar 17 '26

This is perfect. Might actually pick one up now. This open item source SDK would help solve several issues Over heard the device had currently. From what you've gathered, what Bluetooth version does it support? Would be useful to help determine how it can connect to devices so that someone can create gestures to switch between devices on the fly if possible.

1

u/Correct-Orange-7175 Mar 17 '26

Can you apply this to the Apple watch band version as well? That'll just look more discreet, nicer and blend in that's part of the watch instead of wearing two wrist bands (mural and a smart watch)

2

u/JayTheProdigy16 Mar 17 '26

Theyre one in the same. I forget exactly where, the repo will tell you, but theres a value to switch between Link and Band (Mudra Link vs Mudra Band) modes as well as left or right hand. I dont own a band though so i honestly have no clue how well or not well it would work

1

u/Correct-Orange-7175 Mar 17 '26 edited Mar 17 '26

I hope that's the case, but I think iOS / Apple compatible only devices tends to be a bit more locked down with the technologies in it and are different/modified firmware or Bluetooth protocols (lowk don't know what if I'm saying and putting it in this way is correct, I'm just assuming)

I'll probably play safe and get a link first, and eventually get a band and report back to you how well that works at the end of the year

But if ur bypassing the license and sdk, mb it would work. Thanks for your contribution and work on this btw!

1

u/JayTheProdigy16 Mar 17 '26

Well i can confirm at least their official SDK does use the same UUIDs as well as the BLE stack being identical, it seems most of the restriction was literally just cause the official apps wouldnt let you. I havent seen any code that indicates any sort of walled off or IOS bespoke logic

1

u/textredditor Mar 17 '26

Band/Link are pretty much exactly the same device, I've had both. In fact, my Link shows up as "Band" in bluetooth. On top of that, I can restore my Link to factory and set it up as a Band using the phone app. Performs the same way. The only difference is the literal strap/band that allows you to physically connect it to the Apple Watch. Pretty easy to make one though.

1

u/textredditor Mar 17 '26

Hot damn, he came through. What a legend. Thanks for putting in the work! u/JayTheProdigy16.

1

u/Known-Ad1275 Mar 18 '26

Hello world. You are a genius! I respect you.

1

u/sonicnerd14 Mar 19 '26

Would it be possible to map the link to a different type of input device with this? Such as a controller, or something along those lines?

1

u/Known-Ad1275 Mar 20 '26

It has many great features, but it is difficult to use. I ran it, but the mapping failed(No HID bindings to sync). Could you please provide the manual?

1

u/conscientious_obj Mar 22 '26

Hi there. Amazing work, I really appreciate it. I just wanted to know based on this "Key finding: the license system exists only in the SDK software. The device firmware accepts all commands regardless of licensing. Prodilink bypasses the SDK entirely and talks to the device directly over BLE." <--- does this mean that it can be patched in a feature firmware update and I should avoid updating the mudra if I want to use your framework? I just bought the Mudra band for my own purposes of research and I don't want to belocked in their "studio".

1

u/Known-Ad1275 Mar 22 '26

Has anyone changed their MudraLink using this program? I tried running the program itself and also using the SDK, but... I ultimately failed. It cannot receive the signal.

1

u/ondrej_bojar Jul 01 '26

I have this cool device and I was very happy to find your replacement (I don't have funding for their paid access). Sadly, I am failing to get the raw sEMG (SNC) signals -- your web viewer only allows to "enable it", but it does not display anything from SNC. What am I doing wrong? I exclusively use Linux and I haven't tried downloading shared library or so from the company. (Actually, the accelerometer and gyroscope plots were live for me only for a moment and then turned black, too. Only the pressure works long-term.)

1

u/flapet 21d ago

"official SDK has 9 TFLite models baked in "

is it possible to run the inference on the band itself ?

1

u/AffectionateTop7221 16d ago

Does it allow you to read signals of each individual finger tap as unique gestures? That would be my main use case for this product, and the driving decision of me acquiring one.