// the take
Bleak is an asyncio-based Python client for Bluetooth Low Energy, letting you scan for and talk to GATT servers (read/write/notify) on Windows, Linux (BlueZ), macOS, and Android from one API. It's for anyone writing cross-platform tooling for BLE sensors, wearables, or IoT devices without hand-rolling a backend per OS.
Genuinely cross-platform — it wraps WinRT, BlueZ D-Bus, CoreBluetooth, and python-for-android behind one async interface, which is the actual hard problem BLE libraries have to solve. Mature and actively maintained: real CI across platforms including an Alpine VM harness for BlueZ, a dedicated integration test suite against real adapters (winvhci controller, bluez controller), and a changelog going back years. Ships type stubs (py.typed) and typing shims for the native frameworks (CoreBluetooth, Foundation, objc) so you get real autocomplete instead of guessing at ctypes-style bindings. Clean separation of concerns between the public API and backend implementations makes it easy to reason about which OS quirks you're exposed to.
Cross-platform BLE is leaky by nature — the backends don't behave identically (pairing, MTU negotiation, notification reliability, and reconnect behavior all differ by OS and even by BLE chipset), so you will still hit platform-specific bugs and need platform-specific workarounds despite the unified API. GATT only — no classic Bluetooth (SPP, A2DP, etc.), so it's a non-starter if your device needs anything outside BLE. OS version floors are steep for a 'supports everything' library: Windows 11 22000+ and BlueZ 5.55+ cut out plenty of real-world embedded Linux and older Windows deployments. The Android backend depends on python-for-android, which is its own maintenance burden and far less battle-tested than the desktop backends, so treat mobile support as second-class.
We read the README, the directory tree and a key source file in October 2026. Nobody pays to be listed. How we judge →